java - 尝试将 FFmpeg 与 NDK 一起使用时出现 UnsatisfiedLinkError

标签 java android android-ndk ffmpeg java-native-interface

我为 android 编译 FFmpeg 没有任何问题,但是当我尝试在设备上运行应用程序时得到 unsatisfiedlinkerror。

安卓.mk

LOCAL_PATH := $(call my-dir)

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

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

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

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

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

include $(CLEAR_VARS)

LOCAL_MODULE    := native
LOCAL_SRC_FILES := native.c
LOCAL_SHARED_LIBRARIES := libavcodec libavfilter libavutil libswscale libavformat
LOCAL_LDLIBS := -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib \
                -L$(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/lib \
                -llog \
                -lz \
                -ldl \
                -lgcc \
        -landroid \
        -ljnigraphics

include $(BUILD_SHARED_LIBRARY)

native.c(空 c 文件。rly !!)

MainActivity.java
//Trivial blahblah code
...

static {                                                                                
     System.loadLibrary("avformat");                                                     
     System.loadLibrary("avcodec");
     System.loadLibrary("avutil");
     System.loadLibrary("avfilter");                                                     
     System.loadLibrary("swscale");
     System.loadLibrary("native");
}

...

我尝试为 ffmpeg 内容注释掉 System.loadLibrary(),但没有运气。

我注意到,当我使用 loadLibrary()s 从 Android.mk 中删除 -lavformat -lavcodec ... 时,它会使用空的 native.c 进行编译。但是,当我尝试在 native.c 中编译一些有用的代码时,这会导致编译错误,例如:error: undefined reference to 'avformat_open_input' - 当我添加 -lavformat ...

我在stackoverflow中看到了类似的帖子并尝试了一堆,但没有运气。有什么帮助吗?

最佳答案

您可以将您的 logcat 从 native 库的负载发布到完整的 UnsatisfiedLinkError 消息吗?

如果 ffmpeg 已使用共享 C++ 库(如 gnuSTL_shared)编译,则需要集成它(通过在 Application.mk 中设置 APP_STL := gnustl_shared),并在 ffmpeg 库之前加载它。

关于java - 尝试将 FFmpeg 与 NDK 一起使用时出现 UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22874962/

相关文章:

Android ClassNotFoundException,类在 APK 中

java - 按字段分组并计算 java 8 中的非空字段

java - 问题!实体数据未使用数据访问对象 (dao) 和 JPA 获取?

android - 编辑文本并将其放入 ListView

android - 使用 Android DefaultHTTPClient 执行 POST 请求会导致 execute() 卡住

android - ffmpeg编译时出错

java - Socket.io java 客户端多次收到相同的消息

java - 从另一个类调用 string[] 显示为 null

android - 切换到 GCC 4.8 后,Eclipse 未更新 "built-in"包括 Android NDK 项目的路径

android-ndk - 在 NDK 中包含库时出错