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

Android中.so文件缺失Native函数符号引发Unsatisfied Link Error求助

排查JNI UnsatisfiedLinkError(找不到Native函数实现)

针对你遇到的问题,结合提供的代码,从以下几个核心点排查:

1. JNI函数参数不符合规范

非静态Native函数必须接收两个强制参数:JNIEnv*(JNI环境指针)和jobject(当前类的实例对象),你的C++代码完全遗漏了这两个参数,导致函数签名与JVM期望的不匹配,最终无法生成正确的符号。

修正后的C++函数:

extern "C" JNIEXPORT jboolean JNICALL
Java_abc_def_xyz_MainActivity_MyNativeFunction(JNIEnv* env, jobject thiz) noexcept
{
    // 你的业务代码
    return JNI_TRUE; // 建议使用JNI规范的宏替代原生bool值
}

2. 确认Kotlin类的全限定名

检查Kotlin文件的包声明:你的代码中导入了abc.def.xyz,但MainActivity是否真正属于该包?需在Kotlin文件顶部明确添加包声明:

package abc.def.xyz

import android.app.Activity
import android.os.Bundle

class MainActivity : Activity() {
    // ... 你的代码
}

只有类的全限定名是abc.def.xyz.MainActivity,JNI函数的前缀Java_abc_def_xyz_MainActivity_才会匹配。

3. 确保Native库被正确加载

在Kotlin类中添加静态代码块,提前加载对应的.so库:

class MainActivity : Activity() {
    companion object {
        init {
            System.loadLibrary("your-lib-name") // 替换为你的so库名(不带lib前缀和.so后缀)
        }
    }

    public external fun MyNativeFunction(): Boolean

    override fun onCreate(pSavedInstance: Bundle?) {
        super.onCreate(pSavedInstance)
        val check = MyNativeFunction()
    }
}

未加载库时,JVM无法定位到so文件,必然抛出链接错误。

4. 验证编译脚本与符号生成

  • 检查CMakeLists.txt或ndk-build脚本,确保你的C++文件被包含进编译目标:
    add_library(
        your-lib-name
        SHARED
        path/to/your-source-file.cpp # 替换为你的C++文件路径
    )
    
  • 编译完成后,用nm -D your-lib.so命令查看so中的符号,确认是否存在Java_abc_def_xyz_MainActivity_MyNativeFunction。如果没有,说明该函数未被编译进so库。

内容的提问来源于stack exchange,提问作者Rohan Pande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:34:51