前期准备:
1、AndroidStudio版本 升级到2.2或者以上
2、下载ndk和cmake
可以在AS打开SDK manager里勾选NDK和CMake。另外建议也勾了LLDB,这是用于C++代码debug用的
另外ndk下载慢的话,也可以到这里 下载离线包,在新建完项目后手动配置过去

一、前期东西好后,可以开始新建项目(注意勾选Include C++ Support。这样AS会自动添加对C++的支持,否则在后面要手动改gradle脚本才能支持)。后面正常配置到finish就行。

要是前期准备下载ndk离线包的,可以在这里指定好ndk的路径

构建好的项目后,目录如下:

cpp目录跟以前的jni目录对应,用于存放C++的代码
CMakeLists.txt文件和以前的Android.mk和Application.mk对应,都是用于指定编译配置的
再看app级别的build.gradle:

新建好项目后,AS会自动生成了个JNI调用的例子



点击Make project或者直接运行app:

然后就会
1.Gradle调用外部的编译脚本CMakeLists.txt
2.CMake执行编译脚本CMakeLists.txt中的命令,将C++源文件(native-lib.cpp)编译成共享对象库(libnative-lib.so),Gradle再将这个so库打包到APK中。
生成的so库在如下目录里面

点击AS的菜单Build->Analyze apk,选择之前生成的akp,可以看见so包含在apk里面了

二、配置的大概就如上,开始编写自己的java调用native的方法

因为AS发现java方法没有C++实现,就报红,此时可以如下:

AS会自动在native-lib.cpp里面生成好方法的模板,自己在里面实现具体逻辑就行。然后在MainActivity里面调用就行。

插曲:修改后代码如下,这时候直接运行会报java.lang.UnsatisfiedLinkError: Native method not found错误。

注意系统自动生成方法的时候没有extern"C",需要自己加上,这里去掉注释就好。这是因为C和C++的符号表不相同造成的。jni是按照C的生成规则去找函数的, 所以在函数声明的时候要加上extern C使编译器把函数按照C的规则编译 这样才能被Java调用。
网友评论