最近项目中需要调用c/c++的实现,Android是支持JNI的,所以体验了一下JNI的全过程
1. 前期环境准备
(1) 下载NDK,网址是https://developer.android.com/ndk/downloads/index.html, 国内用户需要翻墙。目前官网上mac版最新的是android-ndk-r10e-darwin-x86_64.bin, 文件比较大,300多M。
下载下来后,解压到相应目录,备用。解压命令如下:
ndk$ ./android-ndk-r10c-darwin-x86_64.bin
解压后在原目录会生成一个新的文件夹(android-ndk-r10e), 里面即是NDK的各种工具。
windows系统应该是可以直接用7zip或者zip工具解压,生成一个包含NDK环境的文件夹。 都比较简单。
(2) 设置NDK环境变量
cd ~
touch .bash_profile
open -e .bash_profile
添加如下:
export NDK_ROOT=/Users/your_account/.../android-ndk-r10e
source .bash_profile
然后重启terminal, 输入ndk-build, 应该会输出一大堆的信息。
类似下面的信息:
MacBook-Pro:~$ndk-build
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/Users/xxxxx/android-ndk-r10e/build/core/build-local.mk:143: *** Android NDK: Aborting . Stop.
这样前期的环境准备就完成了。
2. JNI的编写
这是官网上一篇介绍JNI的文章, http://developer.android.com/training/articles/perf-jni.html。 里面有提到如何调用JNI的方法,
以及如何在JNI中访问java的对象或者方法或者属性。 这里就不详细介绍了。
在Android Studio中,在响应的java代码的地方写好native的方法。
接着就是要生成c的头文件,需要用到javah命令,首先cd到source文件夹目录下,android studio中的目录是src/main/java
调用javah生成头文件,调用方法如下:
javah -classpath /Users/....../sdk/platforms/android-21/android.jar:. -d jni com.test.native.nativeUtils
执行完没有问题的话,会在同目录生成jni文件夹,里面包含了生成的c的头文件。
需要注意的两点, classpath的最后有:., 第二点是java的class名称,用.替代目录分隔符。
3. 编写JNI程序,这个没啥说的,就是c或者c++程序。
4. 编写Android.mk和Application.mk
同样的,android官网提供了很多的帮助性文档
https://developer.android.com/ndk/guides/android_mk.html
https://developer.android.com/ndk/samples/sample_na.html#apm
简略如下:
生成的so的名字,同样也是在java中loadlibrary中的名字。
LOCAL_SRC_FILES 指定了编译的源代码的文件名,可以指定多个
LOCAL_MODULE := native-test
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
然后编写Application.mk, 指定最小支持的api level等属性
APP_ABI := all
APP_PLATFORM:= android-21
APP_OPTIM := release
5. 生成so文件
最后ndk-build命令,会生成各种格式的so文件, 大功告成。
6. 在java程序中加载生成的so文件。
static {
loadLibrary("native-test");
}
版权声明:本文为博主原创文章,未经博主允许不得转载。