【发布时间】:2015-01-11 23:06:24
【问题描述】:
我正在尝试使用 Android NDK 为 x86_64 架构编译 Lame 声音库。对于对bcopy 和index 的未定义引用,我收到以下链接错误:
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 的库,并注意到 bcopy 和 index 都在 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 文件。
Application.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)
【问题讨论】:
-
Android x86_64 很有趣。直到您提出问题(导致从 Android NDK 团队找到Developers, start your 64-bit engines),我才知道 Android 提供了它。
-
我什至无法为目标 Android x86_64 配置 Autoconf。你是如何设法建造它的?这是 Stack Overflow 上的一个相关问题:Autoconf triplet for Android x86_64?。另请参阅 Autoconf 邮件列表中的问题:How To Configure for Android? (Redux for x86_64)。
-
我没有做任何配置,除了使用包管理器安装 android-21。顺便说一句,我似乎需要在 x86_64 中进行本机编译的唯一原因是让它在我的模拟器中运行。我使用的是 64 位 mac,而 x86[-32] 速度非常慢。事实上,我什至无法启动模拟器。有没有其他方法可以让模拟器在 x86 arch 上运行?附言我对 Android 非常陌生 - 现在正好 2 周 :)
-
点击编辑来编辑你的问题。添加您的
Application.mk和Android.mk。
标签: android android-ndk