【问题标题】:Fail to use Vitamio Android ffmpeg library: cannot locate '__aeabi_llsl'无法使用 Vitamio Android ffmpeg 库:找不到“__aeabi_llsl”
【发布时间】:2013-04-17 00:31:11
【问题描述】:

我完全关注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'...

救命!!

【问题讨论】:

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

标签: android-ndk ffmpeg


【解决方案1】:

我想我明白了。 出于某种原因,此处不能使用 lib*.a。 (虽然我发现churnalbs的一个版本用过,但我猜他用的是不同的ndk,可能是ndk5rc)

所以我将*.o编译成libffmpeg.so,并在Android.mk中使用PREBUILT_SHARED_LIBRARY(具体使用方法见ndk文档)

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");

现在,编译工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2016-04-08
    • 2018-01-14
    相关资源
    最近更新 更多