参考了很多csdn博主的文章,看到好多人写的在native程序中直接用printf函数输出信息,不懂介个是怎么做到的,反正我这边用printf输出信息,在模拟器上无显示耶
1.配置jdk,ndk,下载ADT,CDT等环境
2.打开eclipse,新建Android Application Project。File-New-Project-Android Application Project
在弹窗中设定Application Name(Project Name与其同名,本例TestJNI),Package Name(自定义,本例com.panjinya.testjni),指定sdk版本
一路Next
设定Activity类名(本例HelloPJY.java),点击finish
3.检查NDK Location是否设定正确
4.新建Android 模拟器(自行百度)
5.(新建JNI目录及相关文件)右键工程名,选Android Tools-Add native support,指定JNI编译成的库名称(本例Testpjyjni),会新建同名cpp文件以及Android.mk文件
6.在java工程中src目录下,编辑HelloPJY.java文件。pjyJNI为即将在本地C++代码中实现的函数
package com.panjinya.testjni;
import android.app.Activity;
import android.os.Bundle;
public class HelloPJY extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pjyJNI();
}
static{
System.loadLibrary("Testpjyjni");
}
private native void pjyJNI();
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">7.使用javah命令生成对应的头文件</span>
首先检查bin/classes目录下对应的package子文件夹中是否有上述java文件的类,然后cd到工程所在路径的src目录下,输入
javah com.panjinya.testjni.HelloPJY 即 javah 包名+类名
会生成对应的com_panjinya_testjni_HelloPJY.h文件在当前目录下,这个文件无需编辑,直接拷贝到工程路径的/jni目录下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_panjinya_testjni_HelloPJY */
#ifndef _Included_com_panjinya_testjni_HelloPJY
#define _Included_com_panjinya_testjni_HelloPJY
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_panjinya_testjni_HelloPJY
* Method: pjyJNI
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_panjinya_testjni_HelloPJY_pjyJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
8.编辑jni目录下的Testpjyjni.cpp文件
由于需要打印调试信息,验证是否成功执行该程序,在Android Application中不能直接使用printf之类的函数输出信息,需要用NDK中提供的log方法打印信息
http://blog.youkuaiyun.com/qiuxiaolong007/article/details/7548580
具体使用方法参见上述文档
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "HelloPJY"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#include "com_panjinya_testjni_HelloPJY.h"
JNIEXPORT void JNICALL Java_com_panjinya_testjni_HelloPJY_pjyJNI
(JNIEnv *env, jobject obj)
{
LOGD("MY MESSAGE");
return;
}
9.编辑Android.mk文件,使得其可以输出log信息。(在第8,9两步,我反复看到各种错误,有时候LogCat里面根本没有任何信息,无论怎么修改cpp写法或者mk文件都无济于事,但是,最后删了模拟器重建,重启eclipse后,似乎好了。另外我还修改了Android.mk文件,没有使用$(SYSROOT)/usr/lib -llog这种格式,就没问题了)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Testpjyjni
LOCAL_SRC_FILES := Testpjyjni.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
10.点击项目,Build project,编译.so文件成功后,点击Run as-Android Application,用指定的模拟器就可以了,在LogCat中可以过滤到自己的信息