【问题标题】:UnsatisfiedLinkError when calling method from native library although System.loadLibrary seems ok从本机库调用方法时出现 UnsatisfiedLinkError 尽管 System.loadLibrary 似乎没问题
【发布时间】:2024-05-29 15:10:01
【问题描述】:

我有一个 Android Studio 1.2.2 项目设置,其中包含一些本机 *.so 文件,项目 -> src -> main -> jniLibs -> armeabi (这对他们来说是正确的架构)。我有一个类以静态方式加载库并链接到本机方法(我认为/希望)。

这是 System.loadLibrary 的静态:

static {
    try {
        System.loadLibrary("<SOME LIB>");
    } catch(UnsatisfiedLinkError ule){
        Log.e(TAG, "Error while loading library <SOME LIB>", ule);
    }
}

我从未点击过 catch 块或看到错误消息,但我已确认我输入了静态并到达 System.loadLibrary 行,所以我不认为我在加载它时遇到了问题。

我在另一个类中导入了这个:

import com.<rest-of-pacakage-name>.<SOME LIB>

并且有一个本地方法 initialize 需要一个字节:

public native static int <SOME LIB>_Initialize(byte[] Parameter);

这一切都基于我在 AS 上移植的另一个 Eclipse 项目。

我有什么想法/建议或方法可以确定为什么库加载似乎很好但方法调用不正常的根本原因?

 07-22 08:38:51.810  27119-27119/com.<rest-of-package-name>.staging E/art﹕ No implementation found for int com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(byte[]) (tried Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize and Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize___3B)
07-22 08:38:52.360  27119-27119/com.<rest-of-package-name>.staging E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.<rest-of-package-name>.staging, PID: 27119
    java.lang.UnsatisfiedLinkError: No implementation found for int com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(byte[]) (tried Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize and Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize___3B)
            at com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(Native Method)
            at com.<rest-of-package-name>.ui.base.BaseDrawerActivity.setupDrawer(BaseDrawerActivity.java:150)
            at com.<rest-of-package-name>.ui.base.BaseDrawerActivity.onCreate(BaseDrawerActivity.java:99)
            at com.<rest-of-package-name>.ui.main.MainActivity.onCreate(MainActivity.java:15)
            at android.app.Activity.performCreate(Activity.java:6221)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
            at android.app.ActivityThread.access$900(ActivityThread.java:172)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5835)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

包含静态和本机方法的类的包名:

package com.<rest-of-package-name>.pppp_api;

【问题讨论】:

  • 您应该在问题中包含准确的错误消息,以及消息所指符号的准确声明。
  • 谢谢...我在上面更新了堆栈跟踪
  • 可能是您的包名中缺少“1”:com.p2p.pppp_1api... 而不是 com.p2p.pppp_api...?
  • 我不得不再次更新堆栈跟踪...我不小心拉了一个旧的。我认为这必须处理构建风味...我有一个附加 .staging 的登台风味...可以吗?

标签: android android-studio android-ndk unsatisfiedlinkerror


【解决方案1】:

1) 如果您更改包含本机方法的类的包名,您应该更改本机代码中的方法签名。

2) 尝试再创建一个名为 armeabi-v7a 的文件夹并将 *.so 复制到那里,因为某些设备无法使用旧 armeabi 并忽略该文件夹中的库

3) 在模块 graddle 脚本中,在“android”块中添加以下行:

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

【讨论】:

  • 你带领我走上正确的道路......谢谢。所以问题似乎是 *.so 文件为其本机方法引用了不同的包名称。我只提供了 *.so 文件而不是 C 文件来更改它,所以我必须创建一个与确切包名称匹配的包装模块,然后一切正常。
最近更新 更多