2013-01-25 73 views
15

我在我的android應用程序中使用本機代碼。首先,我只使用一個庫。所以一切正常。但現在我不得不再整合一個庫。我不知道什麼應該是我的項目的jni文件夾的理想結構(如在哪裏放置整個代碼等)。我找到了一個工作。我在jni.i.e library1和library2中創建了兩個文件夾。再次在這兩個文件夾中創建一個jni文件夾並將相應的代碼放入文件夾中。NDK編譯多個庫

我得到它來編譯。兩個.so文件都正在生成,但我無法在我的應用程序中使用它。我不能使用System.loadLibrary(「library1.so」)加載庫;也嘗試提供完整路徑。但失敗

此外,我不知道在父jni文件夾的Android.mk文件內寫什麼。

當前結構: project_folder - > JNI - > LIBRARY1 - > JNI - > 「源代碼」 的Android.mk這裏所寫 project_folder - > JNI - > library2 - > JNI - > 「源代碼」 一個Android .mk這裏

更新#1寫到:

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. 

我不使用Application.mk。 這是我的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

我發現最好的結構是使用JNI /文件夾僅NDK-建立makefile和外界保持源在自己的文件夾。這很容易添加到現有的項目,而不需要在jni下重構你的樹。

但是,您必須小心處理LOCAL_PATH變量和使用$(call my-dir)。這裏有一個工作示例:

  • MyProject的/
    • LIBRARY1/
      • 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任選分裂出來的部分,以自己makefile文件。

+2

此外,使用調用LoadLibrary時,離開了「所以」部分,例如系統。的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