You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:18:03