我为 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/