このエラーを経験した人はいますか?
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」クラスは現在のフォルダーに存在するはずです。
命名規則があることに注意してください。 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に変換されます。
これは私を助けました。同じ問題を思い付くかもしれない誰かのためにそれを共有します。
Android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
現在、ラジオをストリーミングする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ビットプロセッサを搭載したすべてのデバイスで動作します。
私のために働いたのは、jniLibsフォルダnder「main」フォルダを、「Java」および「res」フォルダのすぐ横に配置することでしたプロジェクト->アプリ-> src->メイン-> jniLibs
すべてのライブラリに正しい名前を付け、それぞれをそれぞれのアーキテクチャサブフォルダに配置しましたが、同じ例外がありました。ここで受け入れられた回答のような他のSO回答をたくさん試してみました。JARを.so libsでコンパイルしたり、jniLibsフォルダーを他に配置したりなど。
このプロジェクトでは、Android Studio 1.5.1でGradle 2.2およびAndroid Plugin 1.1.0を使用する必要がありました
-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"
}
}
`
Android Studio 3.0を使用していますが、この問題が発生します。そして、アプリのbuild.gradleは大丈夫だと確信しています。
[実行]-> [構成の編集]-> [プロファイリング]に移動し、[高度なプロファイリングを有効にする]を無効にします。
これは私のために動作します。 参照回答
これは私のために働いています
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ファイル内
一部の古いgradleツールは、何らかの方法で.soファイルをビルドフォルダーにコピーできません。以下のようにこれらのファイルをビルドフォルダーに手動でコピーすると、問題を解決できます。
build/intermediates/rs/{build config}/{support architecture}/
ビルド構成:beta/production/sit/uat
サポートアーキテクチャ:armeabi/armeabi-v7a/mips/x86
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'
}
}
}
モジュールをC++コードで使用し、同じ問題がある場合は、試してみてください
Build -> Refresh Linked C++ Projects
また、このモジュールからいくつかのファイルを開いて実行する必要があります
Build -> Make module "YourNativeLibModuleName"
さらに別のクラッシュの原因と考えられる解決策は、この記事で説明されています: 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>");
}
}
System.loadLibrary
lib
フォルダーから共有ライブラリーをロードします。
「現在のフォルダに「example」クラスが存在するはずだ」と言うときはどういう意味ですか? .soライブラリをlib
フォルダーに配置する必要があります。
これはデバイス関連の問題である可能性があります。
このエラーはMIデバイスのみで表示され、コードは他のすべてのデバイスで機能していました。
これは役立つかもしれません:
defaultConfig{
...
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
}
私にとって、問題はNDK_ROOTが設定されていないことにありました。
次の場合にコンソールを確認します。
NDK_ROOT =なし[!] NDK_ROOTは定義されていません。環境またはlocal.propertiesでNDK_ROOTを定義してください
設定したかどうかを確認します。