2013-02-17 147 views
5

我有一系列現有的庫,我需要在Android應用程序中重用。佈局是類似於:如何使用Android NDK以正確的依賴順序構建多個項目?

\庫\ libOne
\庫\ libTwo [靜態庫]
\庫\ libThree
\應用程序\ MyApplication的\ [應用]

libTwo依賴在libOnelibThree取決於libTwo。我怎樣才能讓構建系統以正確的順序構建所有的庫?我試圖使用Eclipse,但如果有必要,我可以使用命令行。

所有這些庫最終都會被Java應用程序引用(並使用JNI與它們進行交互)。有關我如何設置Android.mk/Application.mk文件的任何線索?

我試過對libTwo使用BUILD_STATIC_LIBRARY,但它實際上並沒有輸出任何文件!我期待一個libTwo.a文件,但沒有得到編譯或構建。

我在應用程序中寫入一個Android.mk嗎?或每個項目的Android.mk?

+0

你可以分享你的Android.mk?目前還不清楚你如何設置你的項目。 – 2013-02-19 14:04:36

+0

@AlexCohn我還沒有工作的Android.mk,那就是問題所在。我正在尋找一個描述如何構建所有三個庫並將它們從主應用程序鏈接到一起的答案。 – 2013-02-19 20:50:59

+0

我知道你還沒有工作的Android.mk,但你還沒有工作,不是嗎? – 2013-02-20 12:59:06

回答

0

項目屬性中有一個android部分,您可以在其中編輯庫依賴項。只有在libOne libTwo和libThree被標記爲庫的情況下,才能使用它們的屬性面板。

3

好的,現在我看到您的編輯,這使得回答具體問題成爲可能。

必須如果你想使用Android NDK建立自己的本地庫/ IE具有至少一個Android.mk文件爲您的應用程序。雖然這不是要求。可以通過Cmake構建它,或者使用「傳統」構建文件或「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文件,手動解包並從設備文件系統上的任何地方加載它(前提是您的應用程序有權寫入和讀取此文件)。

但是,如果我們過濾出異國情況,那麼在${project_root}/jni目錄中有一個Android.mk會更加舒適。根據ndk-build命令,每個庫都是一個單獨的MODULE,但所有這三個都可以在一個Android.mk文件中定義。另一方面,如果你的圖書館是孤立的(例如來自不同的第三方),你可能會更喜歡創建三個Android.mk文件。幸運的是,ndk-build不過是gnu make的一個包裝,Android.mk中的簡單include語句與任何其他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) 

您應該從Applications/MyApplication/ [Application]目錄運行ndk-build - 無論是從命令提示符還是通過Eclipse ADT插件。

更新同樣可以由一個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) 
+0

感謝你們,我嘗試使用多個Android.mk文件,但它導致重新定義LOCAL_PATH('$(call my-dir)'返回NDK核心目錄,而不是在第一行調用時的實際目錄! – 2013-02-21 09:48:51

+0

Absolutely !'(call my-dir)'應該是文件中的第一行,但這與一個或多個Android.mk文件的問題無關。 – 2013-02-21 17:11:11

相關問題