2013-04-17 47 views
0

我正在關注以下instruction of vitamio to build the ffmpeg library on Android未能使用Vitamio Android ffmpeg庫:找不到'__aeabi_llsl'

編譯工作,我得到libffmpeg.so,以及幾個靜態庫,如libavcodec.a,libavformat.a等。我複製libffmpeg.so,以及其他lib * .a(在大小寫我將在後面的文件夾中使用lib * .a)。

然後我在我的Android ffmpeg應用程序的jni部分使用它。 jni部分在C++中獨立工作。

在Android.mk中,我嘗試了不同的設置,但總是有錯誤。 的Android.mk設置爲:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
include /android-opencv/OpenCV-2.4.2-android-sdk/sdk/native/jni/OpenCV.mk 

LOCAL_MODULE := native_sample 
LOCAL_SRC_FILES := jni_part.cpp 

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include 

LOCAL_LDLIBS += -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) 

LOCAL_LDLIBS += -lffmpeg 
LOCAL_LDLIBS += -llog -ljnigraphics -lm -lz -ldl -lgcc 

的錯誤是:

04-16 19:16:46.998: E/AndroidRuntime(10375): FATAL EXCEPTION: main 
04-16 19:16:46.998: E/AndroidRuntime(10375): java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1963]: 69 could not load needed library 'libffmpeg.so' for 'libnative_sample.so' (load_library[1105]: Library 'libffmpeg.so' not found) 

但libffmpeg.so是文件夾中。

然後,我用另一個設置:

LOCAL_LDLIBS += -lavformat -lavcodec -lswscale -lavutil -lswresample 
LOCAL_LDLIBS += -lgcc -llog -ljnigraphics -lm -lz -ldl 

現在的錯誤是不同的,就是:

04-16 19:19:29.777: D/dalvikvm(10419): Trying to load lib /data/data/com.example.andrvideoprocess/lib/libnative_sample.so 0x4051cb60 
04-16 19:19:29.787: E/AndroidRuntime(10419): FATAL EXCEPTION: main 
04-16 19:19:29.787: E/AndroidRuntime(10419): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1312]: 69 cannot locate '__aeabi_llsl'... 

我想這些庫的幾個不同的順序,輸出相同的錯誤信息。

我去的文件夾:$(NDK_PLATFORMS_ROOT)/ $(TARGET_PLATFORM)/弓臂/ usr/lib目錄 (即/ usr/src目錄/ Android的NDK-R8B /平臺/ Android的14 /弓臂/ usr/lib目錄) 發現,沒有libgcc.a的

我去一個工具鏈文件夾(我根據halfninja的Android + ffmpeg的指令建),「Android的ffmpeg的-X264 /項目/ JNI /工具鏈/ lib目錄/gcc/arm-linux-androideabi/4.6.x-google/armv7-a」,鍵入命令:

$ nm libgcc.a > output.txt 

我發現以下信息__aeabi_llsl:

_ashldi3.o: 
00000000 t $a 
0000000c N $d 
00000000 T __aeabi_llsl 
00000000 T __ashldi3 

於是我包括以下Android.mk:

LOCAL_LDLIBS += -L/android-ffmpeg-x264/Project/jni/toolchain/lib/gcc/arm-linux-androideabi/4.6.x-google/armv7-a 

的編譯一次。 同樣的錯誤: 無法加載庫:

reloc_library[1312]: 69 cannot locate '__aeabi_llsl'... 

幫助!

+0

問題與libgcc.a有關,它是鏈接的順序,但我不明白爲什麼添加'-lgcc'。構建系統應該已經爲你連接libgcc.a(靜態版本)。從刪除開始,做一個乾淨的構建。 – auselen

+0

謝謝。我刪除了-lgcc,並清理了構建項目,然後運行該項目。完全一樣的錯誤。順便說一句,爲什麼我不能使用libffmpeg.so? – user1914692

+0

檢查日誌,如果可能的話核心。這可能會提供一個線索。 – auselen

回答

0

我想我知道了。 由於某些原因,lib * .a無法在此處使用。 (雖然我發現了一個版本由churnalbs用它,我猜他用不同的NDK,可能ndk5rc)

所以我編譯*的.o到libffmpeg.so,並在Android.mk使用PREBUILT_SHARED_LIBRARY(如何使用它,請參閱ndk doc)

include $(CLEAR_VARS) 
LOCAL_MODULE := ffmpeg_VITAMIO_prebuilt 
LOCAL_SRC_FILES := libffmpeg_VITAMIO.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 
include $(PREBUILT_SHARED_LIBRARY) 


LOCAL_SHARED_LIBRARIES := ffmpeg_VITAMIO_prebuilt 

而且我還需要在java中添加下面的內容。

System.loadLibrary("ffmpeg_VITAMIO_prebuilt"); 

現在編譯作品。