web-dev-qa-db-ja.com

Android NDK Java.lang.UnsatisfiedLinkError:findLibraryはnullを返しました

Android JNIアプリに上記のエラーがありますか?続きを読む...

前もって、私はすでに自分のやり方でこれを解決したと言いますが、Androidビルドシステム(おそらくEclipseに関して)が壊れていると感じています。おそらく、他の人がこの問題に遭遇し、彼らのために働いたものについてコメントすることができます。

しばらくの間、NDKを使用して開発したJNIコードを含むAndroidプロジェクトがありました。そして、今日、Javaコードを実行してからプーフを実行すると、JNIライブラリをロードできなくなりました。

E/AndroidRuntime(999):Java.lang.UnsatisfiedLinkError:mylibraryをロードできませんでした:findLibraryはnullを返しました

私はグーグルですべてを試しました(Eclipseの再構築、終了、再起動など)

最終的に私の問題を解決したのは何ですか?別の実行を試みる前に、デバイスからアプリを物理的にアンインストールしました。それでおしまい。その後、動作しました。何がうまくいきましたか?

51
Lee Dixon

LOCAL_MODULE "libXYZ"のネイティブプロジェクトがある場合は、必ず次のようにロードしてください。

System.loadLibrary("XYZ");
15
Roy

シミュレーターでアプリを実行しようとしている場合は、実行->実行構成->ターゲットで正しいアーキテクチャを指定していることを確認してください(ウィンドウ-> Android Virtual Device Manager)。

アプリがARM用にプリコンパイルされたライブラリを使用しているときに、Intelシミュレーターでアプリを実行しようとすると、同じ問題が発生しました。

13

私もこの問題を抱えていますが、私の状況では、別のプロジェクトでライブラリを使用しています。そして、私はそれがEclipseやAndroid-ndkの問題だとは思わない。

UnsatisfiedLinkErrorにつながる可能性のあるこれらのヒントを確認することができます。

  1. jNIインターフェースの命名規則に従う必要があり(以前にライブラリを正常にロードしたと言ったため、これを無視できます)、ライブラリはディレクトリ/your project/libs/armeabi/
  2. 上記のことを確認したら、生成されたライブラリがapp.apkにinstalledであることを確認する必要があります。そうしないと、libが見つからず、エラーが発生します。これを行うには、Eclipseプロジェクト名を右クリックして、Build Path-ビルドパスの構成、左側のメニューでJavaビルドパス、右パネルのOrder and Exportタブをクリックしますライブラリ名の前にあるチェックボックスをオンにするをクリックし、[〜#〜] ok [ 〜#〜]その後、プロジェクトをクリーン、リビルド、実行すると、libsがapp.apkにインストールされ、処理が完了します。

enter image description here

enter image description here

enter image description here

編集:

  1. wordでは、ライブラリがapp.apkにインストールされていない場合、UnsatisfiedLinkErrorがスローされるため、正常にリンクできません。
11
BillHoo

Libsフォルダー内に、armeabi-v7aという新しいフォルダーを作成し、.soファイルをarmeabiから新しいフォルダーにコピーしました。エラーを解決します。

6
stevelo

私の場合、システムアプリケーションを作成しているときに、問題は権限に関連していました。 「。so」ファイルを/system/lib/または/system/vendor/lib/ディレクトリに配置した後、デフォルトの割り当てられたアクセス権を600から755に変更しました。うまく機能しました。

6
aditya

私は同じ問題を抱えていましたが、これらは私のプロジェクトで発生した問題の一部です:


  1. System.load("hello-test");からSystem.loadLibrary("hello-test");;への変更
  2. C関数のシグネチャをJNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz)に変更:ここではJava_<Java_package_name>_<Java-class-name>_<function-name>を使用します。
  3. NDKパスをlocal.propertiesに追加します。私の場合はndk.dir=<my-path-to-ndk-directory>;そして
  4. build.gradleを更新して、defaultConfig内にも含める:ndk { moduleName "hello-test" }

  • パッケージ名:com.example.testndk
  • Javaクラス名:TestNDK
  • Cソース名:hello-test.c
  • プロジェクト構造内のJNIディレクトリの場所:AndroidProjects/TestNDK/app/src/main/jni

IDE:Android Studio 0.8.1。

5
Daniel

最初に、EclipseのlibsフォルダーまたはAndroid studio。のjniLibsフォルダー内にjniファイルがあることを確認します。任意のsvnをチェックインするときは、クロスチェックで.soファイルもチェックインします。

私のシナリオは、Android studio。

Android studioでビルドする場合、ライブラリの.soファイルまたは(jni)ファイルは\ src\main\jniLibs\armeabi ***。soフォルダー内にある必要があります。

これらのファイルはEclipseの\ libs\armeabi ***。so内にあるためです。

EclipseとAndroid studioの両方を使用してビルドする場合、build.gradleファイルを次のように変更する必要があります。

main {
            manifest.srcFile 'AndroidManifest.xml'
            Java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']

            // Fixed Issue : "Android studio Java.lang.unsatisfiedlinkerror: couldn't load find library returned null"
            // Cause : For Android studio : The JNI files should be placed in the /src/main/jniLibs folder.
            // Fix : Mapping the jniLibs 's source Directories with Lib's folder
            jniLibs.srcDirs = ['libs']
}

ここでは、AndroidスタジオとEclipseの両方を使用してプロジェクトを構築しています。

4
Vishnu Prabhu

これまでの答えは私の問題を解決しませんでしたが、これは解決しました。問題に沿って、必要なサブディレクトリとファイルが存在しないということでした。 libsフォルダーにあるのは、適切な.soファイルを含むarmeabiフォルダーだけでしたが、3つのファイルがあり、それぞれに.soファイルが含まれているはずです。他の3つ(armeabi-v7a、mips、またはx86)のうちどれが必要なものであるかはまだわかりませんが、Application.mkファイルをAndroid.mkと同じフォルダーに追加すると、3つすべてが自動的に生成されたことを知っていますファイルを作成し、次の行が含まれていることを確認します。

APP_ABI := all

私にとって、その行はそこにある唯一のテキストです。 ndk-buildを実行すると、Application.mkファイルにより、4つのフォルダーすべてが作成され、適切な.soファイルが作成されます。 Application.mkを適切な場所に配置したら、ndk-buildを再度実行し、Eclipseプロジェクトをクリーンでクリアしてから再試行しました。すべてが完璧に実行されました。

2
Alyoshak

同様の問題が発生しました。

/data/data/your.package.name/libディレクトリを確認してください

パッケージディレクトリに移動すると、現在次のように表示されます。

lib -> /mismatched_uid/settings_10037/fs_1000

たぶん、誤ってsharedUserIdを切り替えたため、ライブラリにアクセスできなくなりました。

2
icyerasor

追加した

extern "C"

関数が宣言する前
例:

extern "C"
jstring
Java_lara_myapplication_MainActivity_stringFromJNI(
            JNIEnv *env,
    jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

その後、エラーはなくなりました

1
TheLastSummer

私はちょうどこれを起こしたのですが、問題はデバイスにライブラリをインストールするのに十分なスペースがないということでした。他のアプリをいくつかアンインストールしてから、それが機能しました。

1
Keith Johnston

「libXYZ.so」を使用するネイティブプロジェクトがある場合は、/ system/lib/libXYZ.soがデバイスに存在しないことを確認してください。苦しい回避策があります:使用

System.load("/data/data/your.package.name/lib/libXY.so") 

System.loadLibrary()の代わりに。

1
Alex Cohn

エミュレータでdevice..deployアプリをルート化し、フォルダを参照する必要はありません

1
Mayank Mehta

UnsatisfiedLinkerrorはthisによって解決されます。「ndk_build」によって.soファイルを再度ビルドします

0
Udit Kumawat

同じ問題があった。ちょうどプロジェクトをきれいにし、それは働いた。神秘..

0
Drag0