2 . CMakeList.txt 完整配置代码
# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.4.1)
# 设置函数库编译
add_library( # 参数 1 : 设置生成的动态库名称 native-lib # 参数 2 : 设置生成的函数库类型 : ① 静态库 STATIC ② 动态库 SHARED SHARED # 参数 3 : 配置要编译的源文件 native-lib.cpp) # 使用下面的方式引入动态库会出现于 Android.mk 配置一样的问题 , 6.0 以上的 Android 系统在运行时出现找不到路径的问题 # 引入动态库 #add_library(add SHARED IMPORTED) # 设置函数库的导入路径 #set_target_properties(add PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libadd.so) # 打印日志信息 # ${ANDROID_ABI} 的作用是获取当前的 CPU 指令集架构 # 当本次编译 armeabi-v7a CPU 架构时 , ${ANDROID_ABI} 值为 armeabi-v7a # 当本次编译 x86 CPU 架构时 , ${ANDROID_ABI} 值为 x86 message("CMAKE_SOURCE_DIR : ${CMAKE_SOURCE_DIR}, ANDROID_ABI : ${ANDROID_ABI}") # 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib # 这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库 # # 可以不配置 : # 可以不进行该配置, 直接在后面的 target_link_libraries 中链接 log 也不会出错 find_library( log-lib log) # 打印日志库位置 message(${log-lib}) # 设置变量 # CMAKE_CXX_FLAGS 表示会将 C++ 的参数传给编译器 # CMAKE_C_FLAGS 表示会将 C 参数传给编译器 # 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径 # CMAKE_SOURCE_DIR 指的是当前的文件地址 # -L 参数指定动态库的查找路径 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}") # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目标 # 参数 2 ~ ... : 后面是之前预编译的动态库或静态库 , 或引入的动态库 target_link_libraries( native-lib # 表示 编译 native-lib 模块, 要链接 add 模块 add ${log-lib})
3 . Java 层代码
package kim.hsl.cmake;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
public native String stringFromJNI();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
4 . C++ 层代码
#include <jni.h> #include <stdio.h> #include <stdlib.h> #include <android/log.h> //调用 libadd.so 动态库中的方法 extern "C" { //注意在 C++ 中调用 C 语言方法 , 需要做兼容设置 extern int add(int a, int b); } extern "C" JNIEXPORT jstring JNICALL Java_kim_hsl_cmake_MainActivity_stringFromJNI( JNIEnv *env, jobject obj) { //调用动态库中的函数 int sum = add(1, 2); // Logcat 打印计算结果 __android_log_print(ANDROID_LOG_INFO, "JNI_TAG", "Native Caculate (CMake Build) : %d + %d = %d", 1, 2, sum); //将加法运算转为字符串 , 字符串如果不够长就报错 ... char str[100] = "0"; //字符串格式化 sprintf(str, "Native Caculate : Shared Library (CMake Build) : %d + %d = %d", 1, 2, sum); return env->NewStringUTF(str); }
5 . 运行结果
VI . 博客资源
博客相关资源 :
① CSDN 博客地址 : 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
② 博客资源下载地址 : https://download.csdn.net/download/han1202012/12162546
③ 示例代码 GitHub 地址 : https://github.com/han1202012/009_NDK_CMake_Shared