2013-05-22 39 views
2

這是一個與視頻處理相關的Android應用程序。 使用的庫是ffmpeg + x264,並根據ffmpeg_vitamio工作鬆散編譯爲什麼它抱怨找不到一個圖書館,即使我已經包含它?

編譯的ffmpeg的好,libffmpeg.so根據下面創建:

$CC -lx264 -lm -lz -shared --sysroot=$SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $EXTRA_LDFLAGS libavutil/*.o libavutil/arm/*.o libavcodec/*.o libavcodec/arm/*.o libavformat/*.o libswresample/*.o libswresample/arm/*.o libswscale/*.o -o $PREFIX/libffmpeg.so 

這裏libx264被列入爲共享庫,從libx264.so.130更名爲

然後我把libffmpeg.so放在我的Android項目中。 編譯很好。但是運行的時候,錯誤是:

05-21 13:17:45.066: E/AndroidRuntime(3973): FATAL EXCEPTION: main 
05-21 13:17:45.066: E/AndroidRuntime(3973): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libx264.so.130" needed by "libffmpeg.so"; caused by load_library(linker.cpp:745): library "libx264.so.130" not found 

我想創建libffmpeg.so,我用-lx264 我以爲所有的鏈接庫時,將被納入到最終輸出庫。

但無論如何,讓我試着找出解決方案。 我把libx264.so或libx264.so.130放在幾個目錄中,例如/ jni,/ libs,/ obj等。

或者我也嘗試在jni的Android.mk中添加-lx264。

但存在相同的錯誤。

所以我的問題是: (1)當gcc創建共享庫時,輸出.so庫是否包含鏈接共享庫,這裏是libx264.so?

(2)我上面的項目出了什麼問題?

回答

3
  1. 當GCC創建共享庫,該output.so將不包括鏈接庫,出現這種情況僅適用於靜態庫,雖然output.so將有一個動態的部分表示,現在需要什麼都庫它properly.if運行

    readelf -d libffmpeg.so

    它會顯示其所需要什麼所有的庫進行鏈接。現在鏈接器嘗試鏈接並加載所有需要的庫。在你的情況下,它不能找到libx264.so.130,因爲它不包含在你的項目中。

  2. 我還沒有嘗試過你在做什麼,但將庫複製到jni或lib文件夾將無法幫助我相信,您將不得不將它包含在您的make文件中作爲PREBUILT_SHARED_LIBRARY。我認爲這個鏈接可能會解決您的問題。 How can i link prebuilt shared Library to Android NDK project?

+0

最後應該在哪裏添加共享庫? PREBUILT_SHARED_LIBRARY? LOCAL_JNI_SHARED_LIBRARIES? LOCAL_SHARED_LIBRARIES? –

1

@digitzedx,我認爲你的答案是非常不錯的。所以我按照說明爲libx264.so添加預建庫,就像我爲libffmpeg所做的一樣。所以

include $(CLEAR_VARS) 
LOCAL_MODULE := libx264_prebuilt 
LOCAL_SRC_FILES := libx264.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 
include $(PREBUILT_SHARED_LIBRARY) 

然後:

# Note: I have put commands for ffmpeg_prebuilt 
LOCAL_SHARED_LIBRARIES := ffmpeg_prebuilt 
LOCAL_SHARED_LIBRARIES += libx264_prebuilt 
LOCAL_LDLIBS += -llog -ljnigraphics -lz -dl -lx264 
include $(BUILD_SHARED_LIBRARY) 

在Android SRC,加

System.loadLibrary("x264") 
System.loadLibrary("ffmpeg") 
System.loadLibrary("native_sample") 

建設項目顯示在控制檯上說: libffmpeg.so安裝,libnative_sample.so,在libs/armeabi-v7a中的libx264.so,其中libnative_sample.so是我的jni程序。

再次,相同的錯誤存在:libx264.so.130沒有找到

我試圖用LOCAL_LDLIBS的不同的順序,它不會改變。

卡住了。幫幫我!

我認爲也許問題在於: 它正在尋找libx264.so.130,但我只能將庫命名爲libx264。 但是readelf -d顯示libx264.so中的SONAME是libx264.so.130 不知道系統正在查找什麼,文件名或文件中的SONAME?

+0

好吧,我看到一篇文章「Android JNI,如何使用soname libxx.so.1.2.3加載庫」後找到了一個簡單的解決方法。我將libx264.so.130複製到設備的存儲中,並使用System.load(「libx264.so.130」)。現在它工作了! – user1914692

+0

我在想也許我也可以改變libffmpeg.so的ELF,將它對libx264.so.130的依賴改爲libx264.so。這是否合理?我在這裏找到解決方案:http://stackoverflow.com/questions/2759254/how-can-i-change-the-filename-of-a-shared-library-after-building-a-program-that但是我沒有'試過了。 – user1914692

+0

最後應該在哪裏添加共享庫? PREBUILT_SHARED_LIBRARY? LOCAL_JNI_SHARED_LIBRARIES? LOCAL_SHARED_LIBRARIES? –

相關問題