我正在研究 ffmpeg,我想为 ffmpeg 编写 Jni 包装器,以便我可以调用 ffmpeg avcodec 类的 decode_video 方法。
Swap:SwapFfmpeg swap$ ndk-build
Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
Compile thumb : com_example_swapffmpeg_Jffmpeg <= com_example_swapffmpeg_Jffmpeg.c
SharedLibrary : libcom_example_swapffmpeg_Jffmpeg.so
/Users/swap/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin- x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/com_example_swapffmpeg_Jffmpeg/com_example_swapffmpeg_Jffmpeg.o: in function Java_com_example_swapffmpeg_Jffmpeg_videoinfo:jni/com_example_swapffmpeg_Jffmpeg.c:14: error: undefined reference to 'avcodec_register_all'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libcom_example_swapffmpeg_Jffmpeg.so] Error 1
我创建了 android.mk 文件并链接到 c 包装器类和 libffmpeg.so 文件。
但是当我尝试构建它时,它在 avcodec_register_all
我在谷歌上搜索,我找到了 2 个解决方案
1) 一个是 extern C {} 但我使用的是 .C 文件而不是 C++ 所以我不认为我需要使用 extern {}
2) 其次是添加
LOCAL_LDLIBS := -L/Users/swap/android-ndk-r9/platforms/arch-arm/usr/lib -L$(LOCAL_PATH) -lavformat -lavcodec -lavdevice -lavfilter -lavutil -lswscale -lz -ldl -lgcc
我已将其添加到我的 android.mk 中,但出现此错误。任何人都可以告诉我我应该写什么 Local_LDLIBS 信息以及为什么要写那个?
/Users/swap/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/com_example_swapffmpeg_Jffmpeg/com_example_swapffmpeg_Jffmpeg.o: in function Java_com_example_swapffmpeg_Jffmpeg_videoinfo:jni/com_example_swapffmpeg_Jffmpeg.c:14: error: undefined reference to 'avcodec_register_all'collect2: ld returned 1 exit status
在这个错误中,为什么它总是转到工具链?但在 android.mk 中我提供了 platform/arch-arm/的核心路径
这是我的android.mk
LOCAL_PATH:=$(call my-dir)
#declare the prebuilt library
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-prebuilt
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include
LOCAL_LDLIBS := -L/Users/swap/android-ndk-r9/platforms/arch-arm/usr/lib - L$(LOCAL_PATH) -lavformat -lavcodec -lavdevice -lavfilter -lavutil -lswscale -lz -ldl -lgcc
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:=com_example_swapffmpeg_Jffmpeg
LOCAL_SRC_FILES:=com_example_swapffmpeg_Jffmpeg.c
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt
include $(BUILD_SHARED_LIBRARY)
最佳答案
我不确定这是否有效,但你可以试试这个
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libavcodec
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavdevice
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavfilter
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
LOCAL_EXPORT_C_INCLUDES := 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 := 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 := ffmpeg/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libswscale
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:=com_example_swapffmpeg_Jffmpeg
LOCAL_SRC_FILES:=com_example_swapffmpeg_Jffmpeg.c
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := com_example_swapffmpeg_Jffmpeg
LOCAL_SRC_FILES := com_example_swapffmpeg_Jffmpeg.c
LOCAL_SHARED_LIBRARIES := libavdevice libavfilter libavutil libswscale libavformat
LOCAL_LDLIBS := -L/Users/swapnil/android-ndk-r9/platforms/$(TARGET_PLATFORM)/arch-arm/usr/lib \
-L$(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/lib \
-lavformat \
-lavcodec \
-lavdevice \
-lavfilter \
-lavutil \
-lswscale \
-llog \
-lz \
-ldl \
-lgcc
include $(BUILD_SHARED_LIBRARY)
关于android - 我在 android 上得到了对 'avcodec_register_all' Ffmpeg 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18537075/