2013-02-17 7 views
5

私は、Androidアプリケーションで再利用する必要がある一連の既存のライブラリを用意しています。Android NDKで正しい依存関係の順序で複数のプロジェクトを構築するにはどうすればよいですか?

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

libTwoが依存:レイアウトはに似ていますlibOneにあり、libThreelibTwoに依存します。すべてのライブラリを正しい順序で構築するためにビルドシステムを取得するにはどうすればよいですか? Eclipseを使用しようとしていますが、必要に応じてコマンドラインを使用できます。

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

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

Android.mkをアプリケーションに1つ書きますか?または各プロジェクトのAndroid.mk?

+0

はあなたのAndroid.mkを共有することはできますか?あなたのプロジェクトをどのようにセットアップするかははっきりしていません。 –

+0

@AlexCohn私はまだAndroid.mkが動作していませんが、それは問題です。私は3つのライブラリをすべてビルドして、メインアプリケーションから一緒にリンクする方法を説明した答えを探しています。 –

+0

まだAndroid.mkが動作していないが、まだ動作していないAndroid Mkはありますか? –

答えて

0

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

3

[OK]をクリックすると、編集内容が表示され、特定の質問に答えることができます。あなたのネイティブライブラリ/ IEを構築するには、Android NDKを使用する場合は

あなた必見は、アプリケーションのための少なくとも一つのAndroid.mkファイルを持っています。しかし、これは必須条件ではありません。 Cmakeを使ってビルドしても構わないし、「従来の」makefileを使った「スタンドアロンのツールチェーン」やMS Visual Studioのプラグインを使ってビルドすることもできます。それは重要な結果です。その結果、バイオニック・ランタイム用の互換性のあるコンパイラで構築された共有オブジェクトが生成されます。

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

しかし、エキゾチックなケースを除外すると、${project_root}/jniディレクトリにAndroid.mkを置く方がはるかに快適です。 ndk-buildコマンドに関しては、各ライブラリは別々のモジュールですが、3つすべてを1つのAndroid.mkファイルで定義することができます。一方、ライブラリが分離されている場合(たとえば、別のサードパーティ製の場合)、Android.mkファイルを3つ作成することをお勧めします。幸いなことに、ndk-buildはgnu makeのラッパーにすぎず、Android.mkの単純なinclude文は他のメークファイルと同様に動作します。要約すると

は、あなたのケースはおそらく、単純な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) 

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

同じ jniディレクトリに1つの Android.mkファイルによって表現することができる

更新

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) 
+0

これはありがとうございました。複数のAndroid.mkファイルを使用しましたが、LOCAL_PATH( '$(call my-dir)')を再定義すると、NDKのコアディレクトリが返され、実際のディレクトリは返されませんでした! –

+0

絶対に! '$(call my-dir)'はファイルの最初の行の1つでなければなりませんが、これは1つまたは複数のAndroid.mkファイルの問題とは関係ありません。 –

関連する問題