安装NDK和CMake
- 打开AS的
Prefrences
—>Android SDK
—>SDK Tools
-
选中 NDK (Side by side) 和 CMake 复选框。我这里之前在
nkd-bundle
中已经安装NDK就没有卸载了注意:如果您在
ndk-bundle
文件夹中安装了 NDK,它会显示在标签为 NDK 的列表中。如果您使用的是 Android Gradle 插件 3.5.0 或更高版本,则可以选中或取消选中该复选框。取消选中该复选框会卸载 NDK,释放磁盘空间,并使该复选框从列表中消失。如果您卸载旧版 NDK,请从项目的local.properties
文件中移除ndk.dir
值,该值现已弃用。
- 打开项目结构
Project Structure
—>SDK Location
- 配置Android NDK路径
新建NDK项目
新建项目,选择Native C++
,
选择默认的C++库即可
点击完成,初始化项目,构建结束会在src目录下生成一个cpp目录,内部包含一个c++源文件native-lib.cpp
和一个CMake配置文件CMakeLists.txt
build.gradle配置
- abiFiltes:设置生成的
.so
库所支持的CPU结构
代码实现
接下来逐个看下这两个文件内容
-
native-lib.cpp
c++源文件,内部实现了Java层声明
Native
方法先看下java层声明的Native方法
与其对应的c++实现文件
其中c++源文件中对应函数命名规则为:
Java_应用包名_类名_方法名(JNIEnv *env,jobject thiz)
注意:包名中的
.
需要替换为_
-
CMakeLists.txt
编译构建
上面代码是我们创建一个NDK项目系统生成的样例,如果我们需要自己实现NDK业务,步骤如下:
- Java层声明Native方法
- 生成对应的C++方法并实现业务逻辑
- 配置
CMakeLists.txt
构建脚本 - 编译构建
经过上述步骤,会默认在app->build->intermediates->cmake->debug/release->obj
目录下生成所支持的不同CPU架构的的动态库(.so
),在我们打包时候会一并打包到APK中。
ps:当然我们也可以指定动态库的生成路径。例如,将构建的so动态库文件存储在应用项目app->jniLibs
目录下:在CMakeLists.txt
构建脚本中我们指定如下脚本():
如何使用
自身项目使用
所谓自身项目使用:即在当前项目内通过Java层声明Native方法,并且在当前项目中通过C/C++实现Native方法,然后通过CMake编译生成so动态库后在当前项目内直接使用,如下:
在需要调用Native的业务处通过static{System.loadLibrary("name");}
加载动态库,然后直接调用Native方法即可
其他项目使用
相对于自身使用,还有一种方式就是将A项目通过CMake编译后的so动态库文件提供给B(其他)项目使用,具体步骤如下:
-
A项目
-
Java层声明native方法
-
生成对应c/c++源文件并实现
-
配置
CMakeLists.txt
脚本文件并编译生成so动态库
-
将生成的so动态度copy给B(其他)项目
-
-
B项目
-
将A项目提供的so动态库文件放在项目的
jniLibs
目录下,或者libs目录下所支持对应的cpu架构目录下(必须在build.gradle中重定向jniLibs.srcDirs=['libs']
),并配置应用所支持的CPU架构(需要依据提供方给到所支持的so动态库来配置)
-
声明native方法(native方法的包名与类名必须与提供方一致,可让提供方连同so动态库一起提供)
-
在项目中使用
配置完成后,在项目需要使用的地方,通过如下代码加载动态库后即可使用
-
更多阅读
-
《NDK 入门指南》