一、搭建Android Studio的NDK环境
1.下载NDK
在设置中搜索 sdk ,在as中下载NDK
2.配置NDK路径
选中我们已经下载好的NDK
如果点击ok后出现如下弹窗,原因是NDK版本过高,与当前AS版本不适配。重新下载一个低版本的即可。
3.配置NDK系统环境变量
新建系统环境变量
添加到Path
配置好后,在命令行窗口,输入ndk-build。出现如下信息即为配置成功。
二、测试demo
1.新建Native C++项目
新建的项目默认有完整的示例代码与配置。
2.查看Java代码
在 MainActivity 中,通过下面的代码,加载了 .so 库。
arduino
static {
System.loadLibrary("native-lib");
}
在Java中加载 .so库的方式有两种
- System.loadLibrary("lib_name")
- System.load("full path")
示例: 以加载一个 native-lib.so
为例。
arduino
//加载的是libnative-lib.so,注意的是这边只需要传入"native-lib"
System.loadLibrary("native-lib");
//传入的是so文件完整的绝对路径
System.load("/data/data/应用包名/lib/libnative-lib.so")
此外,MainActivity 中还有一个方法
arduino
public native String stringFromJNI();
这是一个待实现的接口方法,就是给到Native层去实现
3.查看C++代码
下面来解释一下上述代码中,相关参数的含义:
extern "C"
的作用是让编译器以处理 C 语言代码的方式来处理修饰的 C++ 代码, 既可以修饰一句 C++ 代码,也可以修饰一段 C++ 代码。
JNIEXPORT
是固定的标志,必须包含,表示一个函数需要暴露给共享库外部使用。
jstring
是返回值,也可以是其他 jni 支持的数据类型,比如jint,jstring等等。
JNICALL
是调用标记,表示一个函数是 JNI 函数。
Java_com_example_jnidemo_MainActivity_stringFromJNI
是标准的命名方式。格式是
Java_包名 _ 类名_方法名(参数)
JNIEnv* env
JNIEnv是一个非常重要的结构体,里面含有大量被封装好的函数,我们在Native层的大部分和Java层的操作都通过它。
jobject
如果方法是非静态的,则表示包含这个方法的已经实例化的类对象;如果是静态的,则表示该类的引用。
4.编译运行
编译工程,生成的 .so 文件路径如下
运行在虚拟机上的效果图如下