Android NDK CMake编译SO文件教程
简介
在Android开发中,有时候需要使用C/C++来进行底层开发或者性能优化。NDK(Native Development Kit)提供了一种使用原生代码(C/C++)开发Android应用的方法。而CMake是一个跨平台的构建工具,它可以用简单的语法来描述构建过程,生成与平台无关的构建文件。
本文将教会你如何使用Android NDK和CMake来编译生成SO文件。
整体流程
下面的表格展示了整个流程的步骤:
步骤 | 描述 |
---|---|
1 | 创建一个Android项目 |
2 | 配置NDK和CMake |
3 | 编写C/C++代码 |
4 | 编写CMakeLists.txt文件 |
5 | 构建项目并生成SO文件 |
6 | 使用SO文件 |
下面将逐步讲解每个步骤需要做什么,以及相应的代码和注释。
步骤1:创建一个Android项目
首先,打开Android Studio并创建一个新的Android项目。选择Empty Activity模板,并按照向导的指引完成项目的创建。
步骤2:配置NDK和CMake
在项目的build.gradle文件中,添加以下代码来配置NDK和CMake的版本和路径:
android {
defaultConfig {
// 其它配置
externalNativeBuild {
cmake {
// 设置CMake的版本
version "3.10.2"
// 设置CMakeLists.txt文件的路径
path "CMakeLists.txt"
}
}
ndk {
// 设置NDK的版本
version "21.3.6528147"
// 设置支持的ABI(可根据需要修改)
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
// 其它配置
}
在完成配置后,点击"Sync Now"按钮同步项目的配置。
步骤3:编写C/C++代码
在项目的app/src/main/cpp
目录下,创建一个新的C/C++源文件(例如native-lib.cpp
),并编写相关的代码。例如,可以编写一个简单的C++函数来计算两个整数的和:
#include <jni.h>
extern "C" JNIEXPORT jint JNICALL
Java_com_example_myapplication_MainActivity_addNumbers(JNIEnv *env, jobject thiz, jint a, jint b) {
return a + b;
}
在上面的代码中,我们使用了extern "C"
来标识函数为C语言的调用约定,JNIEXPORT
和JNICALL
用于声明函数为JNI函数。
步骤4:编写CMakeLists.txt文件
在项目的根目录下,创建一个名为CMakeLists.txt
的文件,并添加以下内容:
cmake_minimum_required(VERSION 3.10.2)
project("native-lib")
# 添加C/C++源文件
add_library(native-lib SHARED native-lib.cpp)
# 查找NDK提供的日志库
find_library(log-lib log)
# 链接日志库到SO文件
target_link_libraries(native-lib ${log-lib})
在上述代码中,我们使用add_library
命令来添加C/C++源文件,并使用find_library
和target_link_libraries
命令来链接NDK提供的日志库。
步骤5:构建项目并生成SO文件
点击Android Studio的"Build"按钮来构建项目。构建完成后,可以在以下路径找到生成的SO文件:app/build/intermediates/cmake/debug/obj
。
步骤6:使用SO文件
要在Java代码中使用生成的SO文件,可以通过以下步骤进行:
-
在
app/src/main
目录下创建一个名为jniLibs
的目录(如果不存在)。 -
将生成的SO文件复制到
jniLibs
目录下的相应ABI目录中(例如jniLibs/armeabi-v7a
)。 -
在Java代码中使用
System.loadLibrary
方法来加载SO文件。例如:static { System.loadLibrary("native-lib"); }
完成上述步骤后,就可以在Java代码中调用我们在C/C