新建项目
选择Native C++的项目,我这里给项目的命名是NDKTest。
目录分析
新增了一个cpp
目录,里面有一个CMakeLists
和.cpp
文件。
CMakeLists 文件是用来配置C++编译过程的。
# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1) //指定构建项目最小的CMake版本
# Declares the project name.
project("ndktest") // 指定项目名称
add_library(${CMAKE_PROJECT_NAME} SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
native-lib.cpp) // 指定要编译的源文件
target_link_libraries(${CMAKE_PROJECT_NAME}
# List libraries link to the target library
android
log) // 指定需要链接的库文件
.cpp 文件是用于编写C/C++ 代码的
Java文件变化
JNI静态注册
根据函数名将Java代码中的native方法与so中的JNI方法一一对应。
public native String stringFromJNI();
对应规则:以字符串“Java”为前缀,并且用“_”下划线将包名、类名以及native方法名连接起来就是对应的JNI函数名了。
#include <jni.h>
#include <string>
extern "C" // 告诉编译器这个函数是用 C 语言链接约定(而非 C++)来导出的
JNIEXPORT // 指定这个函数是 JNI 导出函数
jstring // 返回类型为 jstring,即 Java 字符串
JNICALL // 这是 JNI 函数的一个标准宏,表示这是一个 JNI 调用的函数
Java_com_example_ndktest_MainActivity_stringFromJNI(
JNIEnv *env, // JNI 环境指针,用于 JNI 函数调用
jobject /* this */) // Java对象的this指针
{
std::string hello = "Hello from C++"; //创建一个 C++ 字符串
return env->NewStringUTF(hello.c_str()); // // 使用 JNI 环境指针创建一个新的 Java 字符串,并返回
}
指定支持的ABI
在app目录下的build文件里,向android标签里新增
android {
...
defaultConfig {
...
externalNativeBuild {
ndk {
abiFilters.addAll(arrayOf("arm64-v8a","x86","x86_64","armeabi-v7a"))
}
}
}
...
}
同步一下,就可以设置支持的ABI。
可以通过查看apk包里的lib目录来查看支持的ABI平台。
指定编译后的so的名字
先在CMakeLists里进行修改,把原来的name改成了ndkapp
然后在java里修改加载的库
可以通过查看apk的lib目录里对应ABI目录里的so名字来验证是否成功。