[解決済み] System.loadLibrary(...)でネイティブライブラリが見つからない
質問
の既存のネイティブライブラリを使いたいのですが、どうすればいいですか?
別の
Android プロジェクトから利用したいので、NDK ビルドライブラリ (
libcalculate.so
) を私の新しいAndroidプロジェクトにコピーしました。新しい Android プロジェクトで、フォルダ
libs/armeabi/
というフォルダを作り、そこに
libcalculate.so
があります。そこに
はありません。
jni/ フォルダがありません。私のテストデバイスはARMアーキテクチャです。
私のJavaコードでは、ライブラリをロードしています。
static{
System.loadLibrary("calculate");
}
新しいandroidプロジェクトを実行すると、エラーが発生しました。
java.lang.UnsatisfiedLinkError: ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"
エラーにあるように、コピーしたネイティブライブラリが/verdor/libや/system/libにないのですが、私の場合どのように解決すればよいでしょうか?
(apkパッケージを解凍したところ、lib/の下にlibcalculate.soがありました)
=====================================更新
また、プロジェクトルート下に jni/ フォルダを作成し、jni/ 下に Android.mk ファイルを追加してみました。Android.mkの中身は。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libcalculate
LOCAL_SRC_FILES := libcalculate.so
include $(PREBUILT_SHARED_LIBRARY)
次に、プロジェクトルートで、ndk-build を実行しました。その後、ndk-buildによってarmeabi/とarmeabi-v7a/のディレクトリが生成されます(libcalculate.soがフォルダ内に存在します)。
その後、maven buildを実行すると、プロジェクトが正常に構築されました。最終的なapkパッケージの中には
lib/armeabi/libcalculate.so
lib/armeabi-v7a/libcalculate.so
しかし、アプリを実行すると、同じエラーが投げられます。
java.lang.UnsatisfiedLinkError: ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"
どのように解決するのですか?
原因を突き止めるために(そしておそらく同時に問題を解決するために)、以下のことを行ってください。
-
jni フォルダを削除し、すべての .mk ファイルをすべて削除してください。何もコンパイルしないのであれば、これらも NDK も必要ありません。
-
あなたの
libcalculate.so
の中にある<project>/libs/(armeabi|armeabi-v7a|x86|...)
. Android Studioを使用する場合は<project>/app/src/main/jniLibs/(armeabi|armeabi-v7a|x86|...)
となりますが、eclipseを使っているようですね。 -
APKをビルドして、それを zip ファイル として開き、あなたの
libcalculate.so
の中にあることを確認します。 lib/(armeabi|armeabi-v7a|x86|...) にあります。 . -
アプリケーションの削除とインストール
-
実行 dumpsys パッケージ パッケージ|grep yourpackagename を実行して ネイティブライブラリパス または legacyNativeLibraryDir を指定します。
-
実行 ls を実行します。 nativeLibraryPath を持っていたか legacyNativeLibraryDir/armeabi で、libcalculate.soが本当にそこにあるかどうかを確認します。
-
存在するのであれば、元から変更されていないか確認します。 libcalculate.so 正しいアーキテクチャでコンパイルされているか、期待されるシンボルを含んでいるか、欠落している依存関係はないか、などを確認します。libcalculate.so は readelf を使って解析することができます。
ステップ5-7を確認するために、コマンドラインとreadelfの代わりに、私のアプリケーションを使用することができます。 ネイティブLibsモニタ
PS: .so ファイルをどこに置くか、またはデフォルトで生成するかで混乱しがちですが、ここにまとめてあります。
-
libs/CPU_ABI eclipseプロジェクト内
-
jniLibs/CPU_ABI Android Studioプロジェクト内
-
jni/CPU_ABI AAR内部
-
lib/CPU_ABI 最終的なAPKの内部
-
の内部で、アプリの nativeLibraryPath を、<5.0 デバイスの場合はアプリの legacyNativeLibraryDir/CPU_ARCH の中にあります。
ここで CPU_ABI のいずれかを指定します。 armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64 . どのアーキテクチャをターゲットにしていて、どのライブラリ用にコンパイルされたかによります。
また、ライブラリは CPU_ABI ディレクトリの間で混在していないことに注意してください: あなたが使っているもののフルセットが必要で、その中のライブラリは armeabi フォルダーにある lib は armeabi-v7a デバイスにインストールされません。 armeabi-v7a フォルダを作成します。
関連
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] EclipseのAndroidプロジェクトにライブラリ/JARを追加する
-
[解決済み] TabLayoutに対応したandroidデザインでタブテキストのフォントを変更する
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] Android端末がHDPI画面かMDPI画面かを確認する方法は?
-
[解決済み] 非推奨のandroid.support.v4.app.ActionBarDrawerToggleの置き換え方法
-
[解決済み] FABアイコンの色を設定する
-
[解決済み] アンドロイドボタンセレクター
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] Eclipseでのandroid:configChangesでのAdmobエラー
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] react nativeアプリのバージョン番号を更新する方法
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] edittextのテキストがメールアドレスかどうかを確認するには?
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] Android: xml リソースからの整数値
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない