平台: ubuntu10.04
工具:eclipse,装好android-sdk(安卓开发环境),android-ndk(安卓交叉编译环境)
过程:
1. 新建android工程 JNItest:
工程目录在eclipse的workspace目录下:eclipse/workspace/JNItest

HelloJNI.java中调用了native 函数 getInt() 和getIntFromArray(), 如下:

static { *** } 部分为静态块,用于加载本地库。本例中System.loadLibrary("HelloJNI") 表示加载的本地库为 libHelloJNI.so
注:so库默认前缀为 lib
MainActivity.java中调用了HelloJNI类,如下:

2. 针对HelloJNI.java文件生成申明native 函数的头文件
1)首先编译HelloJNI.java文件,得到HelloJNI.class文件:

2)使用javah命令生成HelloJNI.class的头文件:

javah命令说明:
-classpath 表示要生成头文件的HelloJNI.class类文件所在路径,注意该路径不包含该类文件的包路径。例如:在工程目录中,该类文件路径为src/com/example/jnitest/HelloJNI.class ,则-classpath参数后的值为 src/
-d 表示生成的头文件所在的目录,一般放在工程目录下 jni/ 目录内。
最后的com.example.jnitest.HelloJNI表示的是类名(包名+类名称)。javah命令根据该值在src/目录下查找HelloJNI.class文件
运行javah,则在工程目录下的 jni/目录下生成的头文件如下:

3. 根据头文件提供的函数原型编写实现native函数代码的源文件:

源文件文件的名称是任意的,只要在该文件中包含了生成的头文件,并实现了头文件中申明的native 函数即可。
4. 编写make文件:
在jni/目录下,编写make文件 Android.mk

LOCAL_MODULE:= HelloJNI 表示生成的so库文件的名称为 libHelloJNI.so。该名称去掉前缀lib后(so库文件默认前缀为lib)应该和HelloJNI.java 文件中 LoadLibrary(“库名”) 的库名保持一致。
LOCAL_SRC_FILES:= HelloJNI.c 表示源文件为HelloJNI.c
5. 生成so库文件:
在工程目录下运行命令ndk-build

则生成的库文件libHelloJNI.so,在工程目录下的libs/armeabi/目录下。
在eclipse下运行该android工程,则成功实现JNI。
本文详细介绍了如何在Ubuntu 10.04环境下搭建Android开发环境,通过Eclipse创建并配置JNI项目,实现Java与C/C++代码的互操作。包括生成JNI头文件、编译生成SO库文件、以及在Android应用中调用JNI函数的全过程。

247

被折叠的 条评论
为什么被折叠?



