Android ndk 无法使用Vitamio Android ffmpeg库:无法找到'__aeabi#U llsl&x27;

Android ndk 无法使用Vitamio Android ffmpeg库:无法找到'__aeabi#U llsl&x27;,android-ndk,ffmpeg,Android Ndk,Ffmpeg,我正是遵循着这个原则 编译工作正常,我得到了libffmpeg.so以及几个静态库,如libavcodec.a、libavformat.a等。我复制了jin文件夹中的libffmpeg.so以及其他lib*.a(以防以后使用lib*.a) 然后我在Android ffmpeg应用程序的jni部分使用它。 JNI部分在C++中独立工作。 在Android.mk中,我尝试了不同的设置,但总是有错误。 Android.mk设置为: LOCAL_PATH := $(call my-dir) inclu

我正是遵循着这个原则

编译工作正常,我得到了libffmpeg.so以及几个静态库,如libavcodec.a、libavformat.a等。我复制了jin文件夹中的libffmpeg.so以及其他lib*.a(以防以后使用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\u PLATFORMS\u ROOT)/$(TARGET\u 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 AndroidAbi/4.6.x-google/armv7-a”,键入以下命令:

$ nm libgcc.a > output.txt
我在以下信息中找到了uu 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'...
救命

我想我明白了。 由于某些原因,这里不能使用lib*.a。 (虽然我发现了一个由Chrounalbs使用的版本,但我猜他使用了不同的ndk,可能是ndk5rc)

因此,我将*.o编译成libffmpeg.So,并在Android.mk中使用预构建的共享库(如何使用它,请参阅ndk文档)

我还需要在java中添加以下内容

System.loadLibrary("ffmpeg_VITAMIO_prebuilt");

现在,编译可以了。

问题与libgcc.a有关,链接是有序的,但我不明白为什么要添加
-lgcc
。构建系统应该已经为您链接了libgcc.a(静态版本)。从移除它开始,做一个干净的构建。谢谢。我删除了-lgcc,并清理了构建项目,然后运行项目。完全相同的错误。顺便说一句,为什么我不能使用libffmpeg.so呢?如果可能的话,检查日志。这可能会提供线索。libffmpeg.so不起作用的原因是链接未成功。以后让我想想。如果我使用lib*.a,NDK希望定位u aeabi_llsl。这是否意味着我不能简单地使用lib*.a,因为它们不是使用选项“-Wl,--no undefined”创建的?您可以使用静态库,如果NDK想要定位
llsl
,您可以将libgcc.a添加为链接中的第一项,那么它应该可以工作。
System.loadLibrary("ffmpeg_VITAMIO_prebuilt");