web-dev-qa-db-ja.com

java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

このエラーを経験した人はいますか?

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"

この方法でライブラリをロードするとエラーが発生します。

static {
    System.loadLibrary("example");
}

「example」クラスは現在のフォルダーに存在するはずです。

48
developergg

命名規則があることに注意してください。 libはlibexample.soと呼ばれる必要があります。

LoadLibrary( "example")はlibexample.soを探します。

.soライブラリはlibフォルダーの下のapk内にある必要があります(Android用に開発しているため、lib/armeabiフォルダーとlib/armeabi-v7aフォルダーの下にある必要があります。両方のフォルダーが必要な理由Android lib/armeabiの下を見て、lib/armeabi-v7aの下を見てください。

探すべき他のもの:

  • 正しいアーキテクチャ用にコンパイルしてください(armeabi v5用にコンパイルした場合、armeabiv7またはarmeabiv7sでは動作しません)。

  • エクスポートしたプロトタイプが正しいクラスで使用されていることを確認してください(hello jniの例を確認してください。公開された関数は、Java_mypackagename_myjavabridgeclass_myfunctionのように見える必要があります)。

たとえば、関数Java_com_example_sample_helloはJavaクラスcom.example.sample、関数helloに変換されます。

45
MichaelCMS

これは私を助けました。同じ問題を思い付くかもしれない誰かのためにそれを共有します。

Android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}
25
Alex

現在、ラジオをストリーミングするAndroidアプリケーションで作業しています。私はaacdecoderと呼ばれるネイティブデコーダーライブラリを使用します。一部のAndroidデバイスでアプリがクラッシュエラーを取得するまで、すべてが正常でした。本当に迷惑だった。アプリは、Samsung 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)

ご覧のとおり、クラッシュはネイティブライブラリをロードできなかったと言っています。しかし、なぜ?最初に、ネイティブライブラリの.soファイルが正しく配置されている場合、構造を確認しました。

このクレイジーなエラーを除いて、すべてが大丈夫だったようです。その後、いくつかの調査を行った結果、いくつかのAndroidデバイスに64ビットプロセッサが搭載されていることがわかりました。このデバイスは、ネイティブライブラリをロードするためにarm64フォルダーを生成およびチェックします。それが問題でした。私のプロジェクトにはarm64フォルダーがないためです。これが解決策です。

defaultConfig {
    ...

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

}

このフィルター(abiFilters)をアプリモジュールのbuild.gradleファイルに追加する必要があります。そのため、デバイスがアプリを実行しようとすると、gradleファイルをチェックし、フォルダーを生成して既存のネイティブライブラリリソースを使用してはならないことを理解します。ブーム、ほとんど解決しました。しかし、まだもう1つあります。

Android.useDeprecatedNdk=true

非推奨のNdkを使用するには、この行をgradle.propertiesに追加します。

最後に、私のアプリはS6およびS6 Edgeで動作します。つまり、新しい64ビットプロセッサを搭載したすべてのデバイスで動作します。

20
King of Masses

私のために働いたのは、jniLibsフォルダnder「main」フォルダを、「Java」および「res」フォルダのすぐ横に配置することでしたプロジェクト->アプリ-> src->メイン-> jniLibs

すべてのライブラリに正しい名前を付け、それぞれをそれぞれのアーキテクチャサブフォルダに配置しましたが、同じ例外がありました。ここで受け入れられた回答のような他のSO回答をたくさん試してみました。JARを.so libsでコンパイルしたり、jniLibsフォルダーを他に配置したりなど。

このプロジェクトでは、Android St​​udio 1.5.1でGradle 2.2およびAndroid Plugin 1.1.0を使用する必要がありました

10

-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"
    }
}

`

8
Sanket Sangani

Android St​​udio 3.0を使用していますが、この問題が発生します。そして、アプリのbuild.gradleは大丈夫だと確信しています。

[実行]-> [構成の編集]-> [プロファイリング]に移動し、[高度なプロファイリングを有効にする]を無効にします。

これは私のために動作します。 参照回答

7
Smiles

これは私のために働いています

Armeabiに.soファイルがある場合は、ndk内にそのフォルダーのみを記載します。

defaultConfig {
        applicationId "com.xxx.yyy"
        minSdkVersion 17
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        renderscriptTargetApi 26
        renderscriptSupportModeEnabled true
        ndk {
            abiFilters "armeabi"
        }
    }

そして、これを使用します

Android.useDeprecatedNdk=true;

gradle.propertiesファイル内

6
KCN

一部の古いgradleツールは、何らかの方法で.soファイルをビルドフォルダーにコピーできません。以下のようにこれらのファイルをビルドフォルダーに手動でコピーすると、問題を解決できます。

build/intermediates/rs/{build config}/{support architecture}/

ビルド構成:beta/production/sit/uat

サポートアーキテクチャ:armeabi/armeabi-v7a/mips/x86

5
thanhbinh84

Android studioを使用している場合は、ルートフォルダーのgradle.propertiesを編集し、Android.useDeprecatedNdk = trueを追加するだけです。次に、アプリのフォルダー内のbuild.gradleファイルを編集し、以下のようにabiFiltersを設定します。

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

私が助けたのは、jniファイルのソースディレクトリをbuild.gradleファイルに登録することでした。これをgradleファイルに追加します:

Android {
    sourceSets {
        main {
            jniLibs.srcDir '[YOUR_JNI_DIR]' // i.e. 'libs'
        }
    }
}
3
Boris Gitlin

モジュールをC++コードで使用し、同じ問題がある場合は、試してみてください

Build -> Refresh Linked C++ Projects

また、このモジュールからいくつかのファイルを開いて実行する必要があります

Build -> Make module "YourNativeLibModuleName"

2

さらに別のクラッシュの原因と考えられる解決策は、この記事で説明されています: https://medium.com/keepsafe-engineering/the-perils-of-loading-native-libraries-on-Android-befa49dce2db

簡単に:
build.gradle

dependencies {
    implementation 'com.getkeepsafe.relinker:relinker:1.2.3'
}

コードで

static {
    try {
        System.loadLibrary("<your_libs_name>");
    } catch (UnsatisfiedLinkError e) {
        ReLinker.loadLibrary(context, "<your_libs_name>");
    }
}
1
ilyamuromets

System.loadLibrarylibフォルダーから共有ライブラリーをロードします。

「現在のフォルダに「example」クラスが存在するはずだ」と言うときはどういう意味ですか? .soライブラリをlibフォルダーに配置する必要があります。

0
Suvitruf

これはデバイス関連の問題である可能性があります。
このエラーはMIデバイスのみで表示され、コードは他のすべてのデバイスで機能していました。

これは役立つかもしれません:

 defaultConfig{
      ...    
      externalNativeBuild {
                    cmake {
                        cppFlags "-frtti -fexceptions"
                    }
                }
    }
0
AskQ

私にとって、問題はNDK_ROOTが設定されていないことにありました。

次の場合にコンソールを確認します。

NDK_ROOT =なし[!] NDK_ROOTは定義されていません。環境またはlocal.propertiesでNDK_ROOTを定義してください

設定したかどうかを確認します。

  • C/C++-> Build-> EnvironmentのNDK_ROOTおよびSDK_ROOT
  • Android-> NDK
  • Android-> SDK
0
Iris Veriris