java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

dev*_*rgg 50 c++ android swig android-library

有没有经历过这个错误的人?

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.swig.simple-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "liborg.swig.simple.example.so"
Run Code Online (Sandbox Code Playgroud)

通过这种方式加载库时发生错误.

static {
    System.loadLibrary("example");
}
Run Code Online (Sandbox Code Playgroud)

我确定'example'类存在于当前文件夹中.

Mic*_*CMS 47

请注意,有一个命名约定.您的lib需要被称为libexample.so.

LoadLibrary("example")将查找libexample.so.

.so库需要在lib文件夹下的apk下面(因为你正在为Android开发,它需要在lib/armeabi和lib/armeabi-v7a文件夹下 - 为什么这两个文件夹?某些版本的Android看起来在lib下/ armeabi和一些看下lib/armeabi-v7a ... se什么对你有用).

其他要寻找的东西:

  • 确保编译正确的体系结构(如果编译为armeabi v5,它将无法在armeabiv7或armeabiv7s上运行).

  • 确保导出的原型在正确的类中使用(请参阅hello jni示例.您的公开函数需要看起来像Java_mypackagename_myjavabridgeclass_myfunction).

例如,函数Java_com_example_sample_hello将在java类com.example.sample,function hello中进行转换.


Ale*_*lex 30

这对我有帮助.为可能提出相同问题的人分享.

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这并不能解释为什么它会帮助你.我正面临上述问题,已经有**abiFilters**设置. (5认同)

Kin*_*ses 25

我目前正在开发一个流式广播的Android应用程序.我使用原生解码器库,称为aacdecoder.一切都很好,直到应用程序在某些Android设备上出现崩溃错误.这真的很烦人.因为应用程序完美播放几乎所有设备的无线电流,但三星S6和S6 Edge.

崩溃报告说

Fatal Exception: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.radyoland.android-1/base.apk”],nativeLibraryDirectories=[/data/app/com.radyoland.android-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn’t find “libaacdecoder.so”
 at java.lang.Runtime.loadLibrary(Runtime.java:366)
 at java.lang.System.loadLibrary(System.java:988)
 at com.spoledge.aacdecoder.Decoder.loadLibrary(Decoder.java:187)
Run Code Online (Sandbox Code Playgroud)

如您所见,崩溃说它无法加载本机库.但为什么?首先,我检查了我的结构,如果本机库.so文件正确定位.

看起来一切都还好,除了这个疯狂的错误.然后经过一些研究,我发现一些Android设备有64位处理器.此设备生成并检查arm64文件夹以加载本机库.那就是问题所在.因为我的项目没有arm64文件夹.这是解决方案;

defaultConfig {
    ...

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

}
Run Code Online (Sandbox Code Playgroud)

您需要将此过滤器(abiFilters)添加到app模块的build.gradle文件中.因此,当您的设备尝试运行您的应用时,它将检查gradle文件,并了解它不应生成任何文件夹并使用现有的本机库资源.轰,几乎解决了.但还有一件事.

android.useDeprecatedNdk=true
Run Code Online (Sandbox Code Playgroud)

将此行添加到gradle.properties以使用已弃用的Ndk.

最后我的应用程序适用于S6和S6 Edge.我的意思是它适用于每个拥有新64位处理器的设备.

  • 自 2019 年 12 月起,armabi 和 mips 已弃用。支持的 ABI 为 [arm64-v8a、armeabi-v7a、x86、x86_64]。 (2认同)

小智 11

对我有用的是将jniLibs文件夹放在 "main"文件夹下,除了"java"和"res"文件夹之外,例如项目 - > app - > src - > main - > jniLibs

我拥有所有具有正确名称的库,每个库都放在各自的架构子文件夹中,但我仍然有相同的异常; 甚至尝试了很多其他的SO答案,比如这里接受的答案,用.so libs编译JAR,jniLibs文件夹的其他放置等等.

对于这个项目,我不得不在Android Studio 1.5.1上使用Gradle 2.2和Android插件1.1.0


San*_*ani 8

-if gradle.properties不可用,然后首先添加该文件并添加 android.useDeprecatedNdk=true

- 在build.gradle中使用此代码

defaultConfig {
    applicationId 'com.example.application'
    minSdkVersion 16
    targetSdkVersion 21
    versionCode 11
    versionName "1.1"
    ndk {
        abiFilters "armeabi"
    }
}
Run Code Online (Sandbox Code Playgroud)

`


Smi*_*les 7

我使用Android Studio 3.0并遇到此问题.而且我确定app的build.gradle还可以.

转到运行 - >编辑配置 - >分析,然后禁用"启用高级分析".

这适合我. 参考答案


KCN*_*KCN 6

这对我有用

如果您在armeabi中有.so文件,那么单独在ndk内部提到该文件夹​​.

defaultConfig {
        applicationId "com.xxx.yyy"
        minSdkVersion 17
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        renderscriptTargetApi 26
        renderscriptSupportModeEnabled true
        ndk {
            abiFilters "armeabi"
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后使用它

android.useDeprecatedNdk=true;
Run Code Online (Sandbox Code Playgroud)

在gradle.properties文件中


Bor*_*lin 6

帮助我的是在 build.gradle 文件中注册 jni 文件的源目录。将此添加到您的 gradle 文件中:

android {
    sourceSets {
        main {
            jniLibs.srcDir '[YOUR_JNI_DIR]' // i.e. 'libs'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


tha*_*h84 5

一些旧的gradle工具无法通过某种方式将.so文件复制到build文件夹中,手动将这些文件复制到build文件夹中,如下所示可以解决问题:

build/intermediates/rs/{build config}/{support architecture}/
Run Code Online (Sandbox Code Playgroud)

build config:beta/production/sit/uat

支持架构:armeabi/armeabi-v7a/mips/x86


Fax*_*yev 5

如果您使用的是 Android studio,只需编辑根文件夹中的 gradle.properties 并添加 android.useDeprecatedNdk=true 即可。然后编辑应用程序文件夹中的 build.gradle 文件,设置 abiFilters 如下:

android {
....
defaultConfig {
    ....
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
    }
}
}
Run Code Online (Sandbox Code Playgroud)