2013-12-13 80 views
0

我交叉編譯FFmpeg的使用的scripts從衛項目但是我的代碼崩潰OpenSSL的支持,每當我執行以下命令:在Android上使用OpenSSL與FFmpeg的使用NDK

System.loadLibrary("crypto"); // loads OK 
System.loadLibrary("ssl");  // loads OK 
System.loadLibrary("avformat"); // crashes 

錯誤:

dlopen("/data/data/wseemann.media.demo/lib/libavformat.so") failed: dlopen failed: cannot locate symbol "SSL_library_init" referenced by "libavformat.so"... 

我使用工具鏈構建libavformat,然後使用以下Android.mk文件運行ndk-build以創建.so文件:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libswscale 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libavcodec 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libavformat 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libavutil 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

LOCAL_PATH:= $(call my-dir) 

似乎libavformat在加載時需要libcrypto和libssl,但它找不到它們或者不加載它們。有誰知道如何解決這個問題?

回答

0

問題是/system/lib中通常有libssl.so。加載程序System.loadLibrary()更喜歡通往應用程序li​​b目錄的路徑(/data/data/your.package.name/lib),這可能會導致混淆。最簡單的修復方法是使用System.load("/data/data/your.package.name/lib/libssl.so")代替(也有correct ways也可以獲得路徑)。

另一種修復方法是將您準備的libssl.so重命名爲libavssl.so,然後致電System.loadLibrary("avssl")。請注意,也許是您將需要重新編譯libavformat,以便它尋找libavssl.so

+0

Alex,感謝您的反饋。但是,我不認爲這個問題是與System.loadLibrary(「ssl」)的調用,因爲我看到該庫被加載到日誌輸出中,通常這個命令會失敗找不到指定的庫。關於如何重新編譯libavformat以明確查找libavssl.co的任何想法? –

+0

你的意思是logcat顯示/data/data/your.package.name/lib/libssl.so已加載? –

+0

是的Alex,這是正確的。 –