2013-10-05 65 views
6

我有一個用C++編寫的Android項目,並且在鏈接階段有問題。代碼放在一些應該鏈接在一起的靜態庫中。Android:如何正確鏈接我自己的靜態庫?

我在網上發現了很多關於這個主題的問題和答案,其中大多數人建議將我的庫放到Android.mk文件中的LOCAL_STATIC_LIBRARIES。但是,如果我這樣做,我發現LOCAL_STATIC_LIBRARIES的內容被忽略:我的庫沒有鏈接,並且在這裏添加任何虛擬文本都不會生成任何錯誤或警告消息。

我試着這樣說:

LOCAL_STATIC_LIBRARIES := MyLib.a 

或完整路徑:

LOCAL_STATIC_LIBRARIES := $(LOCAL_PATH)/MyLib.a 

沒有一次成功。

如果我把我的靜態庫放到LOCAL_LDLIBS那麼它被鏈接了,但是我得到了一個關於使用非系統庫的警告消息,並且可能構建將是錯誤的。

我Android.mk文件的內容是:

LOCAL_LDLIBS := $(LOCAL_PATH)/MyLib.a ... 

,我得到這個消息:

Android NDK: WARNING:jni/Android.mk:myapp: non-system libraries in linker flags: jni/MyLib.a  
Android NDK:  This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES  
Android NDK:  or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the  
Android NDK:  current module  

我找不到如何使用LOCAL_STATIC_LIBRARIES正確的方式,請幫幫我!

我的Android NDK-R9和Android的sdk_r22.2.1在OpenSuSE的x86和使用目標= Android的18

+0

你好你解決你的問題,包括它?因爲我也面臨着同樣的問題。如果你能幫助我 /// –

回答

1

最有可能的問題在於,你是給圖書館的延伸:

LOCAL_STATIC_LIBRARIES := MyLib.a 

我想,這應該寫成:

LOCAL_STATIC_LIBRARIES := MyLib 
5

見JBL的回答here

LOCAL_STATIC_LIBRARIES變量不能以這種方式工作。首先,你需要定義你希望庫包括一節:

include $(CLEAR_VARS) 
LOCAL_PATH = . 
LOCAL_MODULE := curl 
LOCAL_EXPORT_C_INCLUDES := ../curl/include 
LOCAL_SRC_FILES := ../curl/lib/libcurl.a 
include $(PREBUILT_STATIC_LIBRARY) 

然後,您可以使用

include $(CLEAR_VARS) 
LOCAL_MODULE = mylib 
CFLAGS = ... 
... 
LOCAL_STATIC_LIBRARIES = curl 
include $(BUILD_STATIC_LIBRARY)