我完全遵循instruction of vitamio to build the ffmpeg library on Android。
编译工作,我得到libffmpeg.so,以及一些静态库,如libavcodec.a,libavformat.a等。我复制了libffmpeg.so,以及其他lib * .a(如果我是将在jin文件夹中使用lib * .a。
然后我在Android ffmpeg应用程序的jni部分使用它。 jni部分在C ++中独立工作。
在Android.mk中,我尝试了不同的设置,但始终存在错误。 Android.mk设置为:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include /android-opencv/OpenCV-2.4.2-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := native_sample
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH)
LOCAL_LDLIBS += -lffmpeg
LOCAL_LDLIBS += -llog -ljnigraphics -lm -lz -ldl -lgcc
错误是:
04-16 19:16:46.998: E/AndroidRuntime(10375): FATAL EXCEPTION: main
04-16 19:16:46.998: E/AndroidRuntime(10375): java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1963]: 69 could not load needed library 'libffmpeg.so' for 'libnative_sample.so' (load_library[1105]: Library 'libffmpeg.so' not found)
但是libffmpeg.so在文件夹中。
然后我使用另一个设置:
LOCAL_LDLIBS += -lavformat -lavcodec -lswscale -lavutil -lswresample
LOCAL_LDLIBS += -lgcc -llog -ljnigraphics -lm -lz -ldl
现在错误不同了,是:
04-16 19:19:29.777: D/dalvikvm(10419): Trying to load lib /data/data/com.example.andrvideoprocess/lib/libnative_sample.so 0x4051cb60
04-16 19:19:29.787: E/AndroidRuntime(10419): FATAL EXCEPTION: main
04-16 19:19:29.787: E/AndroidRuntime(10419): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1312]: 69 cannot locate '__aeabi_llsl'...
我尝试了几个不同的这些库的命令,它输出相同的错误信息。
我转到文件夹:$(NDK_PLATFORMS_ROOT)/ $(TARGET_PLATFORM)/ arch-arm / usr / lib (即/ usr / src / android-ndk-r8b / platforms / android-14 / arch-arm / usr / lib) 发现没有libgcc.a
我去了一个工具链文件夹(我根据halfninja Android + ffmpeg指令构建),“android-ffmpeg-x264 / Project / jni / toolchain / lib / gcc / arm-linux-androideabi / 4.6.x-google / armv7 -a“,输入命令:
$ nm libgcc.a > output.txt
我在以下信息中找到__aeabi_llsl:
_ashldi3.o:
00000000 t $a
0000000c N $d
00000000 T __aeabi_llsl
00000000 T __ashldi3
然后我将以下内容包含在Android.mk中:
LOCAL_LDLIBS += -L/android-ffmpeg-x264/Project/jni/toolchain/lib/gcc/arm-linux-androideabi/4.6.x-google/armv7-a
再次编译。 同样的错误: 无法加载库:
reloc_library[1312]: 69 cannot locate '__aeabi_llsl'...
帮助!!
答案 0 :(得分:0)
我想我明白了。 出于某种原因,lib * .a不能在这里使用。 (虽然我发现churnalbs使用它的版本,但我猜他使用了不同的ndk,可能是ndk5rc)
所以我将* .o编译为libffmpeg.so,并在Android.mk中使用PREBUILT_SHARED_LIBRARY(如何使用它,请参阅ndk doc)
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg_VITAMIO_prebuilt
LOCAL_SRC_FILES := libffmpeg_VITAMIO.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_SHARED_LIBRARIES := ffmpeg_VITAMIO_prebuilt
我还需要在java中添加以下内容。
System.loadLibrary("ffmpeg_VITAMIO_prebuilt");
现在,编译工作。