【问题标题】:java.lang.UnsatisfiedLinkError: dlopen failed:java.lang.UnsatisfiedLinkError:dlopen 失败:
【发布时间】:2018-02-08 06:00:10
【问题描述】:

当我在我的项目中添加 .so 文件时,我遇到了这个问题,我尝试了不同的解决方案,但没有任何解决方案可以帮助我。

case: 1 我曾尝试将我的 .so 放在 src/main/jniLibs 和我在下面添加的 gradle 文件中,但得到了同样的错误。

 android {
     sourceSets.main.jni.srcDirs = []
}

case:2 我添加了带有 native-lib.cpp 的 cpp 文件夹,并在 gradle 中添加了以下代码:

defaultConfig {
 ndk {
        abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
  }
   }

case:3 我创建了支持 c/c++ 的新项目,并在 cpp 文件夹下添加了一个 .so 文件,并在 gradle 中添加了以下代码:

defaultConfig {
  externalNativeBuild {
        cmake {
            cppFlags "-std=c++11"

        }
    }
}

My project architecture

错误代码:

FATAL EXCEPTION: main
Process: ai.kitt.snowboy.demo, PID: 15175
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/ai.kitt.snowboy.demo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libsnowboy-detect-android.so" 
 at java.lang.Runtime.loadLibrary(Runtime.java:366)
 at java.lang.System.loadLibrary(System.java:988)
 at ai.kitt.snowboy.audio.RecordingThread.<clinit>(RecordingThread.java:20)
 at ai.kitt.snowboy.Demo.onCreate(Demo.java:49)
 at android.app.Activity.performCreate(Activity.java:6010)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
 at android.app.ActivityThread.access$800(ActivityThread.java:155)  
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:135)
 at android.app.ActivityThread.main(ActivityThread.java:5343)
 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:905)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

我使用的是 android studio 3.0.1,gradle: 3.0.1

【问题讨论】:

  • 您在哪个库中收到此错误以及您收到此错误的架构,此信息有助于回答。
  • 我已经编辑了我的问题,我已经添加了图像。我正在尝试在 armeabi 和 armeabi-v7a 中添加 .so 文件。
  • 如果是手动复制那就不对了,每个架构的库二进制文件都不一样。
  • 请上传整个UnsatisfiedLinkError: dlopen failed日志。结尾消息中有许多信息表明实际发生了什么。
  • 对不起,我没听明白,请你解释一下。

标签: android android-studio android-ndk


【解决方案1】:

尝试在build.gradle添加这个:

sourceSets.main.jniLibs.srcDirs = ['src/main/jniLibs']

或将以下内容添加到android 块中:

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

Gradle 读取默认的 jniLibs 路径时可能会出现问题,将其设为隐式即可。

sourceSets.main.jni.srcDirs 不起作用,因为它定义了jni source,如 cpp 源文件文件夹。

异常堆栈 nativeLibraryDirectories=[/vendor/lib, /system/lib]]] 表明系统根本没有检测到您的库。要验证它,请检查您的 apk 以查看是否有 /lib 文件夹和您的 *.so

【讨论】:

  • 我已经尝试添加这个,仍然面临同样的错误。
  • @KhyatiChitroda 请注意,这是jniLibs.srcDirs,也不是jni.srcDirs。你解压你的apk看看/lib里面有没有so文件?
  • @KhyatiChitroda 它可能在错误的路径中,因为 sourceSet 从模块文件夹开始...答案已更新。
  • 非常感谢您的建议。
  • 如果它真的解决了你的问题,你可以接受答案并投票。 :)
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 2017-04-11
  • 2019-07-31
  • 2020-07-28
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多