您的位置:首页 > 编程语言 > Java开发

eclipse的jni配置

2016-04-14 20:35 323 查看

Eclipse的JNI配置

一、 新建一个Android工程

二、 Java端调用代码书写

本地方法定义:

private native String printJNI();


加载本地库文件

static{
System.loadLibrary("JNILibrary");
}


其中JNILibrary是调用的动态库名,printJNI是调用的本地方法,其返回值类型和参数跟普通的java方法一样。

三、 添加native支持

右键点击工程,选中AndroidTools -> Add Native Support,然后可以为本地库文件重命名,点击OK后,可以看到工程中多出了一个jni文件夹,其中包含一个cpp文件和一个Android.mk文件。此外,在libs文件夹中多出了armeabi文件夹,文件夹中多出了一个libJNITest.so库文件,库文件名由lib+刚刚的命名决定。

四、添加ndk文件路径支持

此时还不能使用native方法,需要添加一些ndk的支持。右键工程,选择Properties -> C/C++ General -> Paths and Symbols(注意第三步和这一步顺序不能颠倒,否则在Properties中将不会看到C/C++ General这个选项),在Path and Symbols中,选择includes选项卡,点击Add,添加下面四个路径:

/home/work/android/android-ndk-r9/platforms/android-18/arch-arm/usr/include/

/home/work/android/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.6/include/

/home/work/android/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include/

/home/work/android/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.6/include/


这四个路径为自己本地当中的ndk文件夹中的路径,选择自己的路径就好。选中这四个路径后,点击界面下方的Export Settings,导出这四个路径到文件,以后添加native支持的时候,可以直接用Import Settings直接导入,而不用每次都手动添加这四个路径。

这些工作完成后点击Apply -> OK,此时工程中会多出几个文件,其中Includes文件夹中包含的就是刚刚加入的路径。

五、创建cpp本地库文件并调用

用命令行cd切换到工程中的src文件目录下,输入命令:(我的工程代码目录是com/peng/jniexercise/MainActivity.java)

javah com.peng.jniexercise.MainActivity


若成功则会在src目录下生成一个.h头文件,这个头文件的名称为

com_peng_jniexercise_MainActivity.h


这个文件的名称是由java的包路径加包名加类名组成的,里面包含了jni调用的cpp模板,打开这个文件,里面的代码为:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_peng_jniexercise_MainActivity */
#ifndef _Included_com_peng_jniexercise_MainActivity
#define _Included_com_peng_jniexercise_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_peng_jniexercise_MainActivity
* Method:    printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_peng_jniexercise_MainActivity_printJNI
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif


可以看到,里面包含了这样一个方法声明:

JNIEXPORT jstring JNICALL Java_com_peng_jniexercise_MainActivity_printJNI(JNIEnv *, jobject, jstring);


这个方法声明虽然很长,但实际上它的结构组成是:

Java_包名_类名_声明的native方法名(参数列表)


将这个文件中的内容拷贝到jni/JNILibrary.cpp中,即将JNILibrary.cpp中的内容全部覆盖,将方法声明改成具体的方法,然后保存,即可在java端调用native方法 printJNI()了。具体的native方法的demo如下:

JNIEXPORT jstring JNICALL Java_com_peng_jniexercise_MainActivity_printJNI
(JNIEnv * env, jobject obj, jstring str){
return env -> NewStringUTF("hello JNI");
}


这时在java端调用printJNI()即可获得native方法返回的字符串”hello JNI”了。

至此,一个简单的JNI配置和调用就完成了。

总结:

注意System.loadLibrary(“库名”)这个方法中的库名要和本地库名一致,如果不一致会导致调用失败。

第三步和第四步的先后次序不能调乱,否则将不会出现C/C++ General选项。

在添加ndk路径支持的时候,可以将配置的路径导出,这样下次导入的时候就不用一个一个路径导入了,只需要导入这个配置文件即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android eclipse native jni