2014-03-27 127 views
1

我已經閱讀了很多關於如何使用Android.mk系統共享預構建庫的文章。該解決方案可以歸結爲兩個步驟:Android NDK:如何構建並使用預構建的庫

  1. 與已建庫的目錄使用*包括$(PREBUILT_SHARED_LIBRARY)*
  2. 項目消耗庫使用* LOCAL_SHARED_LIBRARIES *

(你可以用「STATIC」替代「SHARED」來構建和使用.a而不是.so)

我想要做的是添加一個步驟0:從源代碼構建庫。如果我更改了一個有助於庫的源文件,我希望Android.mk系統按順序執行步驟0,1和2。

我已經在Eclipse/ADT兩個項目:

  1. MyApp的 - 使用在MyLibrary
  2. 在MyLibrary - 包含源文件庫

我問這裏的問題集中在MyLibrary項目。這裏是Android.mk用於在MyLibrary:

LOCAL_PATH := $(call my-dir) 

# step 0: build my library 

include $(CLEAR_VARS) 
LOCAL_MODULE := mylibrary 
LOCAL_LDLIBS := -llog 
LOCAL_SRC_FILES := libsrc1.c libsrc2.c 
include $(BUILD_SHARED_LIBRARY) 

# step 1: export my library (PREBUILT_SHARED_LIBRARY): 

include $(CLEAR_VARS) 
LOCAL_MODULE := mylibrary-prebuilt 
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libmylibrary.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
include $(PREBUILT_SHARED_LIBRARY) 

如果我做了項目 - >乾淨...然後項目 - >在這個項目建立項目我得到的錯誤:

錯誤:jni/Android.mk:mylibrary-prebuilt:LOCAL_SRC_FILES指向缺少的文件。

乾淨刪除.so,我猜測PREBUILT_SHARED_LIBRARY在BUILD_SHARED_LIBRARY重建庫並複製它(即使步驟的順序正確)之前檢測到缺少.so。

如果我註釋掉步驟1並構建,libmylibrary.so被正確構建並複製到libs/armeabi/libmylibrary.so。如果我爲非註釋第2步,做一個項目 - >構建項目,那就是沒有做一個乾淨的第一,我得到這些警告和錯誤:

warning: overriding commands for target `obj/local/armeabi/libmylibrary.so' 
warning: ignoring old commands for target `obj/local/armeabi/libmylibrary.so' 
warning: overriding commands for target `libs/armeabi/libmylibrary.so' 
warning: ignoring old commands for target `libs/armeabi/libmylibrary.so' 

make: *** No rule to make target `jni/../libs/armeabi/libmylibrary.so', needed by `obj/local/armeabi/libmylibrary.so'. Stop. 

我想我明白這些錯誤,但我不看到一種方法來實現我想要的。

我錯過了什麼?

回答

0

您可以完全避免第1步,只是從源重建庫。我不確定我是否理解你描述的三個步驟的好處。隨意澄清。

在所有情況下,你對ndk-build的行爲的分析都是現實的,所有這些都是完全故意的。

NDK本身提供了幾個預建庫,並允許您從源重建它們,如果你想。例如,如果您查看sources/cxx-stl/stlport/Android.mk,您將看到一個變量(STLPORT_FORCE_REBUILD)用於控制是使用預編譯的二進制文件還是從源重建它們。

也許使用類似的方法爲您的項目將工作。

+0

感謝您的評論。我一直在思考我的目標,並得出結論是錯誤的。我想要第0​​步,因爲圖書館正在開發中。我一直在重建它。所以我可能不想要一個預建的圖書館。 – Sam