【问题标题】:Using openssl with FFmpeg on Android with NDK在带有 NDK 的 Android 上使用带有 FFmpeg 的 openssl
【发布时间】:2013-12-13 20:08:04
【问题描述】:

我使用 Guardian 项目中的 scripts 交叉编译了支持 openssl 的 FFmpeg,但是每当我执行以下操作时,我的代码就会崩溃:

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,但找不到或没有加载它们。有谁知道如何解决这个问题?

【问题讨论】:

    标签: android android-ndk ffmpeg openssl


    【解决方案1】:

    问题是/system/lib中通常有libssl.so。加载程序System.loadLibrary() 更喜欢您的应用程序库目录(/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

    【讨论】:

    • 亚历克斯,感谢您的反馈。但是,我认为问题不在于对 System.loadLibrary("ssl") 的调用,因为我在日志输出中看到正在加载的库,并且通常此命令会因找不到指定的库而失败。关于如何重新编译 libavformat 以明确查找 libavssl.co 的任何想法?
    • 你的意思是logcat显示/data/data/your.package.name/lib/libssl.so被加载了?
    • 但是,重命名将无济于事。 nm -D 是否显示从您的 libssl 导出的 SSL_library_init
    • 您可以看到类似的问题已解决here
    【解决方案2】:

    这在 FFmpegMediaPlayer.java 第 614 行对我有用:

    static {
    
        System.loadLibrary("crypto");    // loads OK
        System.loadLibrary("ssl");       // loads OK
    
        for (int i = 0; i < JNI_LIBRARIES.length; i++) {
    
            Log.d("TAG", JNI_LIBRARIES[i]);
    
            System.loadLibrary(JNI_LIBRARIES[i]);
    
        }
    
        native_init();
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2013-07-14
      • 2014-12-02
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多