Android Studio Artic Fox下Java调用C外部.so库的实现步骤问询
Android Studio Artic Fox 版本JNI调用预编译.so库完整操作指南
以下操作适配Artic Fox默认的AGP 7.0+版本,全程无需额外引用第三方工具:
1. 基础文件结构搭建
- 首先在
app/src/main/目录下新建jniLibs文件夹,按支持的ABI类型创建子目录,比如armeabi-v7a、arm64-v8a、x86_64等,将对应架构的预编译.so文件放入对应子目录即可,AGP默认会自动识别该路径下的so文件打包进APK。 - 在
app/src/main/目录下新建cpp文件夹,用于存放JNI封装代码,可在cpp目录下额外新建include子文件夹,存放你自研C/C++库的公开头文件,方便后续引用。
2. 生成正确的JNI函数签名
JNI函数签名遵循固定命名规则:Java_<包名>_<类名>_<方法名>,包名中的点全部替换为下划线,方法名中的下划线需要转义为_1。
推荐两种生成方式,避免手动拼写错误:
- 自动生成:先创建Java侧Native方法承载类,比如
com.youruniversity.demo.NativeApi,在类中定义你需要暴露的native方法,示例:public native int calculate(int input);。之后打开终端进入app/src/main/java目录,执行命令javah -jni com.youruniversity.demo.NativeApi,会自动生成对应头文件,里面包含完整正确的JNI函数签名。 - 手动编写:如果是C文件编写JNI封装逻辑,必须用
extern "C"包裹JNI函数,避免C名称混淆导致运行时找不到方法,示例:
#ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_com_youruniversity_demo_NativeApi_calculate(JNIEnv *env, jobject thiz, jint input) { // 这里直接调用你自研库头文件里的公共C函数即可 return your_lib_calculate(input); } #ifdef __cplusplus } #endif
3. Gradle与构建脚本配置
提前确保SDK Manager中已经安装了NDK和CMake工具:
3.1 修改app/build.gradle配置
在android代码块中添加如下配置:
android { namespace "com.youruniversity.demo" compileSdk 33 defaultConfig { // 保留原有配置不变,新增以下内容 ndk { // 填写你实际要支持的ABI,要和jniLibs目录下的架构对应 abiFilters 'arm64-v8a', 'armeabi-v7a' } externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" cppFlags '' } } } // 新增CMake构建脚本路径配置 externalNativeBuild { cmake { path file('src/main/cpp/CMakeLists.txt') // 填写你SDK中安装的CMake版本号即可 version '3.22.1' } } }
3.2 编写CMakeLists.txt
在app/src/main/cpp目录下新建CMakeLists.txt,内容示例:
cmake_minimum_required(VERSION 3.22.1) project("yourdemo") # 第一步:导入预编译的自研C/C++库 add_library(your_research_lib SHARED IMPORTED) set_target_properties(your_research_lib PROPERTIES # 配置预编译so的路径,${ANDROID_ABI}会自动匹配对应架构 IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libyour_research_lib.so # 配置自研库公开头文件的路径 INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include ) # 第二步:编译你编写的JNI封装代码,示例中封装文件名为jni_wrapper.cpp add_library(jni_wrapper SHARED jni_wrapper.cpp) # 第三步:链接预编译库到JNI封装库 target_link_libraries(jni_wrapper your_research_lib)
4. 功能验证
在Java侧的NativeApi类中添加静态代码块加载JNI封装库:
static { System.loadLibrary("jni_wrapper"); }
之后直接调用类中定义的native方法即可,运行无报错、能正常拿到C函数返回值即为配置成功。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

