2013-01-25 11 views
15

私はアンドロイドアプリでネイティブコードを使用しています。まず、私は1つのライブラリだけを使用していました。だからすべてうまくいった。しかし、今ではもう一つのライブラリをそれに統合する必要があります。私は、私のプロジェクトのjniフォルダの理想的な構造(コード全体を配置する場所など)が何であるか分かりません。私は仕事を見つけました。 jni.i.e library1とlibrary2の中に2つのフォルダを作成しました。もう一度両方のフォルダ内にjniフォルダを作成し、それぞれのコードをフォルダに配置します。複数のライブラリをコンパイルするNDK

私はそれをコンパイルしました。両方の.soファイルが生成されていますが、アプリケーションで使用できません。 System.loadLibrary( "library1.so")を使用してライブラリを読み込むことはできません。また、完全なパスを提供しようとしました。しかし失敗しました

また、私は親JniフォルダのAndroid.mkファイルの中に何を書くべきか分かりません。

現在の構造: project_folder - > JNI - >ライブラリ1 - > JNI - > "ソースコード" Android.mkがここに書かれている project_folder - > JNI - > library2 - > JNI - > "ソースコード" のAndroid私はApplication.mkを使用していない

Gdbserver  : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver 
Gdbsetup  : libs/armeabi/gdb.setup 
make: *** No rule to make target `jni/zap/jni/zap/zap/error.c', needed by `obj/local/armeabi/objs-debug/zap/jni/zap/zap/error.o'. Stop. 

:の.mkはここ

UPDATE#1を書かれています。 これは私のAndroid.mkです:私が見つけた

TOP_PATH := $(call my-dir) 

# Build library 1 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/zap 
LOCAL_MODULE := zap 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/zap 
LOCAL_SRC_FILES := $(LOCAL_PATH)/zap/error.c \ 
$(LOCAL_PATH)/zap/hello-jni.c \ 
$(LOCAL_PATH)/zap/zap.c \ 
$(LOCAL_PATH)/zap/zapd.c \ 
$(LOCAL_PATH)/zap/zaplib.c 
include $(BUILD_SHARED_LIBRARY) 

答えて

20

最良の構造はNDKビルドのmakefileのJNI /フォルダを使用して、自分のフォルダに外部ソースを維持することです。これは、jniの下でツリーを再構築することなく、既存のプロジェクトに簡単に追加できます。

ただし、LOCAL_PATH変数の処理方法と$(call my-dir)の使用については注意が必要です。ここでは作業例です:

  • MyProjectと/
    • ライブラリ1/
      • てsource1.cpp
    • library2/
      • てsource2.cpp
    • JNI/
      • Android.mk
      • Application.mk

Android.mk:

# TOP_PATH refers to the project root dir (MyProject) 
TOP_PATH := $(call my-dir)/.. 

# Build library 1 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/library1 
LOCAL_MODULE := library1 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := source1.cpp 
include $(BUILD_SHARED_LIBRARY) 

# Build library 2 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/library2 
LOCAL_MODULE := library2 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := source2.cpp 
include $(BUILD_SHARED_LIBRARY) 

あなたは、必要に応じて、独自にAndroid.mkのセクションを分割することができますメイクファイル。

+2

をまた、LoadLibrary関数を使用するとき、「.soの」一部を残して、例えばシステム。loadLibrary( "library1")。 – safety

+0

私はあなたの提案を試みました。私は最初の図書館(zapという名前はフォルダなので)から始めました。しかし、私はコンパイルエラーを取得しています。私はコメントにコードを投稿する方法を知らない。アップデート#1を確認してください。ありがとう –

+0

Android.mkが /jni/Android.mkの場合、TOP_PATHを$(call my-dir)/ ..に設定する必要があります。 – safety

0

私は、コマンドラインからコンパイルするとき、私は一度各ライブラリで、二回android update projectを実行することにより、複数のライブラリを含むことができることを発見:

android update project -l ../SDK/library1/ --path . --name $name --target 23 --subprojects 
android update project -l ../SDK/library2/ --path . --name $name --target 23 --subprojects 
ant release