0

いくつかのネイティブライブラリを使用してAndroidアプリケーションを開発しようとしていますが、システムはライブラリを共有しandroid 4.0android 4.1.2は異なります。互換性を確保するために、プラットフォーム4.0からlibskia.soファイルを取得し、プロジェクトにインポートします。サードパーティの共有ライブラリを使用するのと同じように、この共有ライブラリをロードしたいと思います。残念ながら、で実行している間android 4.1.2、私のアプリケーションはまだシステムskiaライブラリを呼び出しているようです。私はこれについて知りません、そして以下は私のAndroid.mkファイルです

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := sample
LOCAL_SRC_FILES := sample-jni.cpp

LOCAL_CFLAGS    := -I /home/WORKING_DIRECTORY/external/skia/include \
-I /home/WORKING_DIRECTORY/external/skia/include/core \
-I /home/WORKING_DIRECTORY/frameworks/base/core/jni/android/graphics  \
-I /home/WORKING_DIRECTORY/frameworks/base/include \
-I /home/WORKING_DIRECTORY/frameworks/base/native/include/android \
-I /home/WORKING_DIRECTORY/system/core/include \
-I /home/WORKING_DIRECTORY/external/skia/include/xml \
-I /home/WORKING_DIRECTORY/external/skia/include/images \
-I /home/WORKING_DIRECTORY/external/skia/include/views \

 LOCAL_SHARED_LIBRARIES :=skia jnigraphics
 include $(BUILD_SHARED_LIBRARY)
 include $(LOCAL_PATH)/prebuilt/Android.mk

およびビルド済みのmakefile

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := skia
LOCAL_SRC_FILES := libskia.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := jnigraphics
LOCAL_SRC_FILES := libjnigraphics.so
include $(PREBUILT_SHARED_LIBRARY)

何か案は?または、互換性を確保するための他の方法はありますか?

4

2 に答える 2

0

安定したAPI以外のシステムライブラリへの依存関係は推奨されないことをご理解いただければ幸いです。しかし、Androidのオープンな性質により、(技術的にもライセンスの観点からも)そのような依存関係を導入することができます。基本的には、チャーターされていない海域で航海し、プラットフォームの次のバージョンだけでなく、同じプラットフォームレベルのベンダー提供(つまり非AOSP)のセットアップでもAPIの変更に備えることを意味します。

理論的には、システムライブラリのバリエーションのコピーをアプリのlibs / armeabi-v7aフォルダーに配置し、 loadLibrary()の代わりにSystem.load(fullPath)を使用してロードできます。

しかし実際には、コードを実行する前にsystem / lib / libskia.soがプロセスにロードされ、同じプロセスで同じlibの2つのバージョンをロードすることはできないと思います。また、古いバージョンのlibskiaは、他のシステムライブラリに依存しているため、システムへのロードに失敗する可能性があります。

フォワード(およびベンダー)の互換性を確保する最も安全な方法は、文書化されていないシステム機能にダイナミックリンクを使用し、途中で注意深いエラーチェックを実行することです。

しかし、多くの場合、システムの文書化されていないAPIは実際には非常に安定しており、GoogleのAndroidチームの優秀な人々は頻繁に重大な変更を加えることはありません。したがって、4.0バージョンのskiaに対してリンクすると、コードは4.1.2以降で機能する可能性が高くなります...

更新:特定のケースでは、古いクラスに追加のフィールドfTextLocaleが追加された場合、まず、クラス宣言の途中にこのフィールドを挿入しなかった開発者を祝福する必要があります。これで合理的な戦略が得られたので、4.1.2ヘッダー(追加のフィールドを含む)を使用し、4.0ライブラリ(新しいフィールドにアクセサーメソッドを導入しない)に対してリンクすると、コードが正常に機能することが期待されます。

于 2013-02-03T09:27:14.853 に答える
0

パラメータRTLD_DEEPBINDを使用してネイティブコードでdlopenを使用することにより、異なるバージョンのlibskiaを使用できます。これにより、グローバルシンボルテーブルが上書きされます。

于 2014-08-29T18:39:11.160 に答える