适用于 x86_64 的 Android NDK 没有 bcopy 和索引引用

标签 android android-ndk

我正在尝试使用适用于 x86_64 架构的 Android NDK 编译 Lame 声音库。对于未定义的对 bcopyindex 的引用,我收到以下链接错误:

jni/libmp3lame/encoder.c:471: error: undefined reference to 'bcopy'
jni/libmp3lame/encoder.c:476: error: undefined reference to 'bcopy'
jni/libmp3lame/id3tag.c:1125: error: undefined reference to 'index'
jni/libmp3lame/newmdct.c:1036: error: undefined reference to 'bcopy'
jni/libmp3lame/util.c:685: error: undefined reference to 'bcopy'

代码成功编译为 x86 和 arm 架构。

所以我深入研究了 NDK 的库,发现 bcopyindex 都导出到 x86 和 arm 平台的 libc.so 中但不适用于 x86_64(请参阅下面的 objdump 输出)。

$> objdump -d android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/libc.so | grep bcopy -A 6
0000b000 <bcopy>:
    b000:   e52db004 push   {fp}    ; (str fp, [sp, #-4]!)
    b004:   e28db000 add    fp, sp, #0
    b008:   e28bd000 add    sp, fp, #0
    b00c:   e8bd0800 ldmfd  sp!, {fp}
    b010:   e12fff1e bx lr


$> objdump -d android-ndk-r10d/platforms/android-21/arch-x86/usr/lib/libc.so | grep -A 6 bcopy
00009fb0 <bcopy>:
    9fb0:   55                   push   %ebp
    9fb1:   89 e5                   mov    %esp,%ebp
    9fb3:   5d                   pop    %ebp
    9fb4:   c3                   ret


$>  objdump -d android-ndk-r10d/platforms/android-21/arch-x86_64/usr/lib/libc.so | grep -A 6 bcopy
<<NOTHING FOUND>>

有什么想法吗?下面是我的 Android.mk 和 Application.mk 文件。

应用程序.mk:

APP_ABI:=x86_64
APP_PLATFORM := android-21

Android.mk:

LOCAL_PATH := $(call my-dir)

APP_PLATFORM := android-21

include $(CLEAR_VARS)

LOCAL_MODULE        := libmp3lame

LOCAL_SRC_FILES     := \
...<list-of-.c-files>...

LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

最佳答案

您可以使用 Application.mk ( docs ) 中的一行来彻底解决此问题:

APP_CFLAGS += -DSTDC_HEADERS

为什么?

LAME 假定某些符号无需通过 #include 显式包含即可访问。但是,它也提供了一种方式来表明显式包含是必要的。

在我的发行版中,冲突文件(machine.hid3tag.c)有如下内容:

#ifdef STDC_HEADERS
# include <stdlib.h>
# include <string.h>
#endif

这是您需要通过设置 STDC_HEADERS 预处理器变量来触发的 block 。上面的行,带有 -D 标志,告诉 C 编译器创建它。

关于适用于 x86_64 的 Android NDK 没有 bcopy 和索引引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27893149/

相关文章:

android - 无法通过传递使用子模块找到 lib

android - 如何识别基于 x86 的 Android 设备是否可以运行 armeabi-v7a?

安卓.Wav E/WVMExtractor(40) : Failed to open libwvm. 所以

java在内部函数中调用父级的回调函数

java - 如何在android中找到两个区域之间的距离

c++ - 无法使用ndk for android生成openssl的静态库

java.lang.UnsatisfiedlinkError : Native method not found

android - 两次调用 ffmpeg.c 导致应用程序崩溃时出现问题?

java - 如何在应用程序运行时探索 SQLite 数据库? Eclipse (Juno) > Android (adb)

java - 无法在 FragmentPagerAdapter 中使用方法 "getString(int resId)"