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

Android集成libDriver.so遇加载失败错误及NDK配置疑问

Android集成预编译.so库报错的问题排查与解决

问题原因

你遇到的UnsatisfiedLinkError通常由以下几个原因导致:

  • 架构不匹配:仅放置了arm64-v8a架构的库,但测试设备是其他架构(如armeabi-v7a、x86_64),系统无法找到对应架构的库文件。
  • 路径配置错误:jniLibs的位置不符合Gradle默认规则,或未在Gradle中显式配置源目录。
  • JNI签名不匹配:Java声明的native int run()方法,其对应的C函数签名不符合JNI规范(你的C库仅提供int run(),不是JNI标准函数),即使库加载成功,调用时也会报错。
  • 依赖缺失:libDriver.so依赖其他第三方库,而这些库未一同打包到应用中。

正确集成步骤

1. 确认jniLibs路径正确性

必须保证库文件路径为:src/main/jniLibs/[架构目录]/libDriver.so(比如src/main/jniLibs/arm64-v8a/libDriver.so),该目录需与src/main/java、src/main/assets同级。

如果测试设备仅为arm64-v8a架构,可在app模块的build.gradle中指定仅打包该架构,避免系统尝试加载其他架构的库:

android {
    defaultConfig {
        ndk {
            abiFilters 'arm64-v8a'
        }
    }
}

2. 配置Gradle识别jniLibs

Gradle 8.0+默认会识别src/main/jniLibs,但如果项目结构特殊,需显式配置源集:

android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
}

3. 处理JNI签名不匹配问题

你当前的Java native方法与C库的函数签名不兼容,必须做以下处理:

  • 方案一(推荐):联系C开发人员,让其修改库,添加符合JNI规范的函数。例如你的Java类是com.example.MyNativeClass,对应的C函数签名应为:
    #include <jni.h>
    #include "你的头文件.h"
    
    JNIEXPORT jint JNICALL Java_com_example_MyNativeClass_run(JNIEnv* env, jobject thiz) {
        return run();
    }
    
  • 方案二:自行编写C粘合代码,用NDK编译成新的.so库(需安装NDK)。具体步骤:
    1. 在Android Studio中安装NDK(Settings -> Appearance & Behavior -> System Settings -> Android SDK -> SDK Tools -> 勾选NDK)。
    2. 创建src/main/jni/native-lib.c文件,写入上述粘合代码。
    3. Gradle 8.0+可自动识别jni目录并编译,编译后生成新的libnative-lib.so,替换原libDriver.so(或同时集成,注意加载顺序)。

4. 排查库依赖

用NDK自带的readelf工具检查libDriver.so的依赖库:

# 替换为你的NDK路径
~/Android/Sdk/ndk/[你的NDK版本]/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-readelf -d libDriver.so | grep NEEDED

如果输出中有Android系统未自带的库,需将这些依赖库也放入对应架构的jniLibs目录中。

5. 验证加载逻辑

确保静态代码块在native方法调用前执行,可添加异常捕获排查加载问题:

public class MyNativeClass {
    static {
        try {
            System.loadLibrary("Driver");
        } catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
        }
    }

    public native int run();
}

内容的提问来源于stack exchange,提问作者Lukas Hanacek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:44:52