7

私は、次の3つの部分で構成される非常に単純なAndroidアプリケーションの開発を開始しました。

  • Javaアプリケーション自体
  • 構築済みの共有ライブラリ(これを呼びますlibfoo
  • ビルド済みのライブラリを使用する別の共有ライブラリ(これを呼びますlibfoowrapper

ファイルシステムは次のようになります。

jni
Android.mk
libfoo.so
foowrapper.c

このAndroid.mkファイルには、次の内容が含まれています。

LOCAL_PATH := $(call my-dir)

#==============================

include $(CLEAR_VARS)

LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so

include $(PREBUILT_SHARED_LIBRARY)

#=========================

include $(CLEAR_VARS)

LOCAL_MODULE := foowrapper
LOCAL_SRC_FILES := foowrapper.c

LOCAL_SHARED_LIBRARIES := foo-prebuilt

include $(BUILD_SHARED_LIBRARY)

Eclipseでアプリケーションをビルドすると、問題なく動作しているように見えます。エラーは報告されていません。ただし、アプリケーションをSamsung Discover(Android 4.0.4を実行)にアップロードすると、ログに次のエラーが表示されます。

03-05 21:20:27.859: E/AndroidRuntime(20324): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]:   102 could not load needed library 'libfoo.so.0' for 'libfoowrapper.so' (load_library[1091]: Library 'libfoo.so.0' not found)

.so.0Dalvikがファイルではなくファイルを探しているのはなぜ.soですか?このエラーを取り除くには、アプリにどのような変更を加える必要がありますか?

4

1 に答える 1

4

少なくとも Linux の世界では、すべての共有ライブラリにはsoname. soname には、プレフィックスlib、ライブラリの名前、句.so、ピリオド、およびインターフェースが変更されるたびにインクリメントされるバージョン番号が続きます (特別な例外として、最下位レベルの C ライブラリは で始まりませんlib)。完全修飾された soname には、それが含まれるディレクトリが接頭辞として含まれます。動作中のシステムでは、完全修飾された soname は、共有ライブラリの への単なるシンボリック リンクreal nameです。

すべての共有ライブラリにはreal name、実際のライブラリ コードを含むファイル名である もあります。実名は、ソネームにピリオド、マイナー番号、別のピリオド、およびリリース番号を追加します。最後の期間とリリース番号はオプションです。マイナー番号とリリース番号は、ライブラリのどのバージョンがインストールされているかを正確に知らせることで、構成制御をサポートします。これらの番号は、ドキュメントでライブラリを説明するために使用される番号と同じではない可能性があることに注意してください。

参考:Linux 標準ベース

編集: これは珍しい問題ではないようですが、実際の解決策は見られていませんが、おそらくこれにより、自分に合ったものを見つけ始めることができます.

PREBUILT_SHARED_LIBRARY 使用時の LOCAL_SRC_FILES の問題 https://groups.google.com/forum/#!topic/android-ndk/_UhNpRJlA1k

Android 用のバージョン管理されていない共有ライブラリの作成 http://www.opengis.ch/2011/11/23/creating-non-versioned-shared-libraries-for-android/

ライブラリ 'libproj.so.0' が見つかりません https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/ai3tu0XXs88

于 2013-03-06T05:43:35.600 に答える