废话不多说,直接进入正题。本篇以Android Studio为例。
要用到NDK开发,那第一步肯定是下载NDK
一:下载NDK
选中CMake,LLDB和NDK,然后点击Apply,进行安装。有的同学可能会问为什么要选中CMake和LLDB,这是因为Android Studio从2.2版本开始支持CMake,在3.0以后已经强制使用CMake就行构建NDK了,在后面会有详细的讲解,稍安勿躁。
二:设置NDK环境变量
好了,到此我们改准备的东西就算全了,我们验证一下NDK环境是否配置好了,打开命令行,输入ndk-build
出现上图所示信息就表明配置成功,如果配置不成功请检查,环境配置是否有拼写错误或者NDK的地址是否正确,再不行,可以将Path中%NDK_ROOT%的位置调整到"."之下。
三:Android Studio中如何配置
1:新建一个Android项目
2:右键项目,选择Module Setting,检查Android NDK location的配置是否正确,一般来说,默认的应该是正确的,如果不正确,请指定到你自己的NDK目录。和NDK环境变量配置的一样。修改后点击“Ok”。
或者直接在local.properties中指定也可,添加下面代码即可:
ndk.dir=C\:\\Workspace\\SDK\\ndk-bundle
3:new JNI的接口类
然后添加一个简单的方法声明:
public class JniKit {
public native String stringFromJni();
}
4:下来实现C的部分提供底层实现。
4.1 生成 .h
可以通过javah生成,在命令行下或者AS自带的terminal窗口下进行。
第一步:cd到JniKit所在包的根目录,本例即为:java目录。
第二步:输入:javah -jni(也可以不写) 包名+类名, javah -jni com.bzhao.ndktest.JniKit ,在目录下会出现com_bzhao_ndktest_JniKit.h的头文件。
第三步:在main目录下创建jni目录,
第四步:拷贝第二步生成的.h文件到第三部生成的jni目录下,然后生成.cpp或者.c的源文件,本篇以.c为例。
点击“OK”。
第五部:编辑JniTest.c
#include "com_bzhao_ndktest_JniKit.h"
JNIEXPORT jstring JNICALL Java_com_bzhao_ndktest_JniKit_stringFromJni
(JNIEnv *env, jclass cls) {
return (*env)->NewStringUTF(env,"Hello, JNI");
}
第六部:在要使用JNI的module下面手动添加CMakeLists.txt,进行配置,AS编译NDK时会用到该文件, 当然如果创建项目的时候已经选择了include C++ support时,这个时候,CMakeLists.txt已经就创建好了,可以忽略此步骤。
在CMakeLists.txt中添加下面代码,如果有多个C或CPP源码,就写多个add_library,其中第一个参数是lib的名字;第二个设置lib为SHARED, 第三个为源码 add_library( # Specifies the name of the library. JniTest # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/jni/JniTest.c )
关联CMakeLists
点击“OK” 或直接在app的build.gradle里进行配置,将下面代码拷贝纸android模块内。
externalNativeBuild {
cmake {
path 'CMakeLists.txt' //CMakeLists.txt的路径
}
}
build一下,检查build出来的apk中是否已经生成响应的so。
次是默认是生成了对所有CPU的架构的支持,但是有时我们不需要这么多,那就需要在build.gradle中指定需要支持那些cpu架构,方式如下,添加如下代码在app的build.gradle。
ndk {
abiFilters "armeabi-v7a", "x86 //添加需要支持的cpu架构
}
然后重新build,就只会在指定的架构下生成对应的so,以减少apk包的大小
第七部: 对so的使用
在需要引用的的地方加入,本例实在JniKit的工具类里使用。
static {
System.loadLibrary("JniTest");
}
然后在其它地方进行应用(验证),本例是用kotlin写的,所以对于有些同学来说有点奇怪,不过重点不在这。
build->run,
第一篇就到此结束了,大家可以自己动手试试。
备注:由于本例没有在新建的时候直接添加C++ 的支持,所以有很多需要手动配置的地方,不过相信大家大部分也是这种情况,如果是新项目,建议大家在创建项目的时候直接就选择C++的支持,这样就省了很多手动配置的地方。
如果有写的不好的地方欢迎大家指正。