初学Android NDK,尝试了好几次没正确编译成功,现在将成功编译之后的方法做一个总结,方便一些可能和我碰到一样问题的朋友。
我使用的NDK版本是??android-ndk-r6
在这个版本中我们不需要进行host-setup.sh的操作了,将ndk解压后(我这里的解压路径是D:\Android_Dev\android-ndk-r6)进入根目录我们会找到一个名为ndk-build的文件,接下来我们用这个文件来编译生成*.so的文件就可以啦。
首先确定你的计算机已安装好Cygwin,且安装了gcc和make
首先你需要创建一个android的工程,这里我们将工程名取名为HelloJNI,在工程创建好以后编写代码,这里我们就采用《android_jni操作指南.pdf》这个电子文档上的代码示例吧。在工程中有两个java文件,如下:
?
Jni.java文件
?
?
?
将你需要编译的Jni.java文件先用javac Jni.java命令生成一个Jni.class,将这个Jni.class文件拷贝到bin目录下你的包目录下覆盖原有的Jni.class,及和其他*.class文件同一目录下
然后进入你的工程bin目录下执行javah命令来编译你刚才用javac生成的Jni.class文件生成一个.h的头文件,如我这里执行javah -jni com.android.HelloJNI.Jni,然后将会在bin目录下生成一个.h的头文件
?
然后再在你的工程根目录下建立一个jni目录,将*.h头文件放进去,这就实现了JNI接口,然后在这个jni目录下创建你的c和c++代码,编写好代码之后接下来就要进行*.so文件的编译生成
将c或者cpp文件放入到一个名为jni的目录下之后,此时你的jni目录下存在*.h,Android.mk和*.c或者*.cpp文件,如我这里有三个文件是:Android.mk ?com_android_HelloJNI_Jni.h 和 HelloJNI.c,且将此jni目录放置于和./ndk-build文件相同目录,在命令执行时系统会自动查找jni目录下的某一文件名的c和cpp文件,然后在成功编译后会生成一个obj目录,在obj/local/armeabi目录下便会找到编译生成的*.so文件
在Cygwin中进入ndk目录 ?如:我这里NDK目录是D:\Android_Dev\android-ndk-r6\
输入命令 ? ./ndk-build 需要编译的c或者cpp文件名
如图示,我这里输入的命令是:./ndk-build HelloJNI
现在在android-ndk-r6的根目录下观察到编译成功且自动创建了obj目录,在obj/local/armeabi目录下找到你刚刚编译生成的*.so文件
将so文件放在与src平级的地方创建目录结构libs/armeabi,文件名格式如:libs/armeabi/libxxx.so,eclipse在打包的时候会根据文件名的命名规则(lib****.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”
注意,在程序中使用System.loadLibrary()调用的时候不要加lib字符,如:你编译的so文件为libHelloJNI.so,则调用的时候就应该写System.loadLibrary("HelloJNI");
现在运行你的程序看能不能自动调用*.so文件且正确运行了,如果正确我们将看到如下图所示的提示了。我这里使用的是一个Toast来提示。
菜鸟入门,如有不足,多多谅解。