5

Androidアプリケーションで再利用する必要がある一連の既存のライブラリがあります。レイアウトは次のようになります。

\ Libraries \ libOne
\ Libraries \libTwo[静的ライブラリ]
\Libraries \ libThree
\ Applications \ MyApplication\[アプリケーション]

libTwoに依存しlibOne、にlibThree依存しlibTwoます。ビルドシステムですべてのライブラリを正しい順序でビルドするにはどうすればよいですか?Eclipseを使用しようとしていますが、必要に応じてコマンドラインを使用できます。

これらのライブラリはすべて、最終的にJavaアプリケーションによって参照されます(JNIを使​​用してライブラリと対話します)。Android.mk / Application.mkファイルを設定する方法についての手がかりはありますか?

libTwoを使ってみましBUILD_STATIC_LIBRARYたが、実際にはファイルが出力されません。私はファイルを期待していましたlibTwo.aが、何もコンパイルまたはビルドされません。

アプリケーションに1つのAndroid.mkを記述しますか?または、プロジェクトごとにAndroid.mkを使用しますか?

4

2 に答える 2

3

OK、あなたの編集が表示されました。これにより、特定の質問に答えることができます。

Android NDK を使用してネイティブ ライブラリをビルドする場合は、アプリケーション用に少なくとも 1 つのファイルが必要です。Android.mkただし、これは必須ではありません。Cmake、「従来の」makefile を使用した「スタンドアロン ツールチェーン」、MS Visual Studio プラグイン、またはその他の方法でビルドしても問題ありません。重要なのは結果です。その結果、バイオニック ランタイム用の互換性のあるコンパイラで構築された共有オブジェクトが作成されます。

ライブラリを${project_root}/libs/armeabi/ディレクトリ (ARM v6 互換デバイスの場合、x86、MIPS、arm v7a の場合はその他のサブディレクトリ) に配置して、APK ビルダーがライブラリを正しくパックできるようにし、アプリ インストーラーが正しいバージョン (デバイスと互換性のある) をアンパックできるようにすることは理にかなっています。プロセッサ) を/data/data/${package_name}/libデバイス上のディレクトリに配置し、最終的にSystem.loadLibrary(short_name)Java から使用できるようにします。ただし、ファイルを別の方法でパックし、so手動でアンパックして、デバイス ファイル システムの任意の場所からロードすることも可能です (アプリにこのファイルの書き込みと読み取りのアクセス許可がある場合)。

しかし、特殊なケースを除外する場合、ディレクトリに Android.mk を配置する方がはるかに快適${project_root}/jniです。コマンドに関してはndk-build、各ライブラリは個別の MODULE ですが、3 つすべてを 1 つの Android.mk ファイルで定義できます。一方、ライブラリが分離されている場合 (たとえば、別のサード パーティから提供されている場合)、おそらく 3 つの Android.mk ファイルを作成することをお勧めします。幸いなことに、ndk-buildgnu make のラッパーにすぎず、includeAndroid.mk の単純なステートメントは他の makefile と同じように機能します。

要約すると、あなたのケースはおそらく単純なApplications/MyApplication/ [Application]/jni/Android.mkファイルでカバーされています。

include ../../Libraries/libOne/Android.mk
include ../../Libraries/libTwo/Android.mk
include ../../Libraries/libThree/Android.mk

libOne と libTwo の間にどのような依存関係があるかはわかりませんが、libOne の場合、ファイルは次のLibraries/libOne/Android.mkようになります

LOCAL_PATH = $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := libOne
LOCAL_SRC_FILES := first.c
include $(BUILD_STATIC_LIBRARY)

Libraries/libThree/Android.mk

LOCAL_PATH = $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := libThree
LOCAL_SRC_FILES := third.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo
LOCAL_STATIC_LIBRARIES := libOne libTwo
include $(BUILD_SHARED_LIBRARY)

コマンドプロンプトから、またはEclipse ADTプラグインを介して、ディレクトリndk-buildから実行する必要があります。Applications/MyApplication/ [Application]

同じ更新は、ディレクトリ内の 1 つのAndroid.mkファイルで表すことができます。jni

LOCAL_PATH = ../../Libraries/libOne
include $(CLEAR_VARS)
LOCAL_MODULE    := libOne
LOCAL_SRC_FILES := first.c
include $(BUILD_STATIC_LIBRARY)

LOCAL_PATH = ../../Libraries/libThree
include $(CLEAR_VARS)
LOCAL_MODULE    := libThree
LOCAL_SRC_FILES := third.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo
LOCAL_STATIC_LIBRARIES := libOne libTwo
include $(BUILD_SHARED_LIBRARY)
于 2013-02-20T21:59:05.087 に答える
0

プロジェクトのプロパティには、ライブラリの依存関係を編集できる android セクションがあります。libOne libTwo と libThree がプロパティ パネルでライブラリとしてマークされている場合にのみ使用できます。

于 2013-02-17T21:10:53.437 に答える