2014-01-27 132 views
2

我有4個靜態庫libavcodec.a libavutil.a libswscale.a libx264.aAndroid的許多鏈接的靜態庫到共享庫

我想將它與libmytest.so

鏈接我試過下面Android.mk腳本

LOCAL_PATH := $(call my-dir) 
INITIAL_PATH := $(LOCAL_PATH) 

include $(CLEAR_VARS) 
LOCAL_MODULE := mytest 

LOCAL_SRC_FILES := mytest.c 

LOCAL_LDLIBS += -llog 
LOCAL_WHOLE_STATIC_LIBRARIES := libavutil libavcodec libswscale libx264 

include $(BUILD_SHARED_LIBRARY) 

mytest.c調用許多功能來自這些圖書館。這4個庫被放置在PROJECTPATH\jni\之內。

但我得到undefined reference來自這些庫的所有功能。

我試着給LOCAL_ALLOW_UNDEFINED_SYMBOLS := true這讓我創建共享庫,但是當我啓動應用程序,我得到

01-22 07:15:15.650: E/AndroidRuntime(9655): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 1868 cannot locate 'avcodec_register_all'... 
01-22 07:15:15.650: E/AndroidRuntime(9655):  at java.lang.Runtime.loadLibrary(Runtime.java:370) 
01-22 07:15:15.650: E/AndroidRuntime(9655):  at java.lang.System.loadLibrary(System.java:535) 
+1

由於這些庫沒有鏈接,所以出現錯誤。編譯時可能NDK找不到這些庫。您需要爲這些庫創建模塊並鏈接到這些模塊。在構建靜態庫的模塊時,不要使用BUILD_SHARED_LIBRARY,而要使用PREBUILT_STATIC_LIBRARY。 – eozgonul

+0

從ndk docs開始,PREBUILT_STATIC_LIBRARY與PREBUILT_SHARED_LIBRARY相同,它要求LOCAL_SRC_FILES的值必須是預構建共享庫的單一路徑,這意味着我無法指定多個靜態庫到PREBUILT_SHARED_LIBRARY ?? – nmxprime

+1

創建多個模塊(在本例中爲4)應該解決「到預建庫的單一路徑」問題。爲每個libavutil,libavcodec,libswscale和libx264創建模塊,然後將它們鏈接到主模塊中。 – eozgonul

回答

3

您需要定義一個PREBUILT_STATIC_LIBRARY對存儲庫中的每一個,如果你不建立他們從源頭,例如

include $(CLEAR_VARS) 
LOCAL_MODULE := avutil 
LOCAL_SRC_FILES := $(LOCAL_PATH)/jni/libavutil.a 
include $(PREBUILT_STATIC_LIBRARY) 

... [重複其他預建庫]。

LOCAL_STATIC_LIBRARIES只能理解模塊名稱,即名稱stuff that have been declared through their own ndk-build module definition。我很驚訝它沒有提供有關丟失模塊的警告,但它是與您的問題相對應的最可能的解釋。

+0

謝謝,這由user2359247的評論解決。但接受這一點,因爲將來有人會覺得它有用! – nmxprime