Android JNIアプリに上記のエラーがありますか?続きを読む...
前もって、私はすでに自分のやり方でこれを解決したと言いますが、Androidビルドシステム(おそらくEclipseに関して)が壊れていると感じています。おそらく、他の人がこの問題に遭遇し、彼らのために働いたものについてコメントすることができます。
しばらくの間、NDKを使用して開発したJNIコードを含むAndroidプロジェクトがありました。そして、今日、Javaコードを実行してからプーフを実行すると、JNIライブラリをロードできなくなりました。
E/AndroidRuntime(999):Java.lang.UnsatisfiedLinkError:mylibraryをロードできませんでした:findLibraryはnullを返しました
私はグーグルですべてを試しました(Eclipseの再構築、終了、再起動など)
最終的に私の問題を解決したのは何ですか?別の実行を試みる前に、デバイスからアプリを物理的にアンインストールしました。それでおしまい。その後、動作しました。何がうまくいきましたか?
LOCAL_MODULE "libXYZ"のネイティブプロジェクトがある場合は、必ず次のようにロードしてください。
System.loadLibrary("XYZ");
シミュレーターでアプリを実行しようとしている場合は、実行->実行構成->ターゲットで正しいアーキテクチャを指定していることを確認してください(ウィンドウ-> Android Virtual Device Manager)。
アプリがARM用にプリコンパイルされたライブラリを使用しているときに、Intelシミュレーターでアプリを実行しようとすると、同じ問題が発生しました。
私もこの問題を抱えていますが、私の状況では、別のプロジェクトでライブラリを使用しています。そして、私はそれがEclipseやAndroid-ndkの問題だとは思わない。
UnsatisfiedLinkError
につながる可能性のあるこれらのヒントを確認することができます。
/your project/libs/armeabi/
編集:
UnsatisfiedLinkError
がスローされるため、正常にリンクできません。Libsフォルダー内に、armeabi-v7aという新しいフォルダーを作成し、.soファイルをarmeabiから新しいフォルダーにコピーしました。エラーを解決します。
私の場合、システムアプリケーションを作成しているときに、問題は権限に関連していました。 「。so」ファイルを/system/lib/
または/system/vendor/lib/
ディレクトリに配置した後、デフォルトの割り当てられたアクセス権を600から755に変更しました。うまく機能しました。
私は同じ問題を抱えていましたが、これらは私のプロジェクトで発生した問題の一部です:
System.load("hello-test");
からSystem.loadLibrary("hello-test");
;への変更JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz)
に変更:ここではJava_<Java_package_name>_<Java-class-name>_<function-name>
を使用します。local.properties
に追加します。私の場合はndk.dir=<my-path-to-ndk-directory>
;そしてbuild.gradle
を更新して、defaultConfig
内にも含める:ndk { moduleName "hello-test" }
。com.example.testndk
TestNDK
hello-test.c
AndroidProjects/TestNDK/app/src/main/jni
IDE:Android Studio 0.8.1。
最初に、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の両方を使用してプロジェクトを構築しています。
これまでの答えは私の問題を解決しませんでしたが、これは解決しました。問題に沿って、必要なサブディレクトリとファイルが存在しないということでした。 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プロジェクトをクリーンでクリアしてから再試行しました。すべてが完璧に実行されました。
同様の問題が発生しました。
/data/data/your.package.name/libディレクトリを確認してください
パッケージディレクトリに移動すると、現在次のように表示されます。
lib -> /mismatched_uid/settings_10037/fs_1000
たぶん、誤ってsharedUserIdを切り替えたため、ライブラリにアクセスできなくなりました。
追加した
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());
}
その後、エラーはなくなりました
私はちょうどこれを起こしたのですが、問題はデバイスにライブラリをインストールするのに十分なスペースがないということでした。他のアプリをいくつかアンインストールしてから、それが機能しました。
「libXYZ.so」を使用するネイティブプロジェクトがある場合は、/ system/lib/libXYZ.soがデバイスに存在しないことを確認してください。苦しい回避策があります:使用
System.load("/data/data/your.package.name/lib/libXY.so")
System.loadLibrary()の代わりに。
エミュレータでdevice..deployアプリをルート化し、フォルダを参照する必要はありません
UnsatisfiedLinkerrorはthisによって解決されます。「ndk_build」によって.soファイルを再度ビルドします
同じ問題があった。ちょうどプロジェクトをきれいにし、それは働いた。神秘..