目前正在学习JNI,从一开始的一无所知,到如今的略知一二,走了很多弯路,为了让有兴趣的同行少走弯路,下面把个人经验记录下来,给你们一个参考: 一、先从SimpleJNI提及: 在Android SDK的源码目录下./development/samples/SimpleJNI能够找到一个最简单的JNI例子,其文件树以下
该例子的主要思想是用JNI生成一个本地库libsimplejni.so,实现一个add(a,b)功能,而后经过SimpleJNI.java调用该库输出显示信息 此例子的Android.mk文件以下:
在Android SDK的根目录下面运行终端,输入以下编译命令:
将获得以下两个文件:
JNI代码的目录为jni/vative.cpp,其内容以下:
编译此JNI代码所须要的Android.mk以下:
应用部分的代码目录为/src/com/example/android/simplejni/SimpleJNI.java,在这个类中Native类是对本地方法的封装,内容以下:
在这个类中调用的过程以下:
一般JNI的使用自下而上有4个层次:本地库、JNI库、声明本地接口的Java类,Java调用者。在本例中,本地库和JNI库合二为一,声明本地接口的Java类和Java调用者合二为一。 二、将以上所获得的libsimplejni.so与SimpleJNI.apk两个文件从Ubuntu中拷贝出来,放置在windows C盘的根目录下, 运行Android模拟器 在windows的“运行”中输入cmd打开windows的命令窗口 输入cd c:\命令切换到C盘根目录下 而后输入adb version确实系统是否已经安装了adb工具,若是已经安装将获得以下内容 Android Debug Bridge version 1.0.26 若是没有安装,能够到\android-sdk-windows\tools目录下将adb.exe和AdbWinApi.dll两个文件拷贝到windows C盘的system32目录下便可 而后输入以下命令将libsamplejni.so拷贝到模拟器的system/lib目录下
再输入以下命令把SampleJNI.apk拷贝到模拟器的system/app目录下
上面可能遇到的问题解决办法: (1)、提示failed to copy 'libsimplejni.so'to'/system/lib/libsimplejni.so':Read-only file system 这是由于当前状态下,此目录是一个只读目录,输入以下命令就能够得到写的权限
(2)、提示failed to copy 'libsimplejni.so'to'/system/lib/libsimplejni.so':Out of memory 这是由于建议模拟器的时候默认的系统memory过小了,关闭当前模拟器,输入以下命令就能够解决此问题
说明:其中Android2.2是我当前所建AVD的名称,128表明的是设置的系统memory的大小,输入此命令以后将会自动打开模拟器 一切正常后,输入相应命令后将获得:
在模拟器中,咱们将看到已经安装好了的Simple JNI运行它以后 将获得咱们所指望的结果 2+3=5 |