Android NDK会返回错误"未定义的引用' rand'"

时间:2015-01-18 14:24:17

标签: android c android-ndk android-x86 libvpx

我正在使用libvpx尝试使用适用于Android x86的webm解码器。

我通过以下命令构建了库并得到了" libvpx.a"。

../configure --target=x86-android-gcc --disable-vp8-encoder --disable-vp9-encoder --disable-examples --sdk-path=$ANDROID_NDK_ROOT --enable-pic --enable-postproc

当我在Windows上使用此库是ndk-build时,发生了错误。

C:/android/[project]/jni/../plib/libvpx.a(postproc_mmx.asm.o)(.text+0x1c8): error: undefined reference to 'rand'
C:/android/[project]/jni/../plib/libvpx.a(postproc_sse2.asm.o)(.text+0x65c): error: undefined reference to 'rand'
collect2.exe: error: ld returned 1 exit status

libmepx.a for armeabi没有发生错误。没有人知道解决方案吗?

(JNI / Android.mk)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := sublib
LOCAL_SRC_FILES := sublib.cpp

LOCAL_LDLIBS := -llog

LOCAL_STATIC_LIBRARIES := libvpx_pre

include $(BUILD_SHARED_LIBRARY)

include $(LOCAL_PATH)/../plib/Android_x86.mk

(PLIB / Android_x86.mk)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := libvpx_pre
LOCAL_SRC_FILES := libvpx.a
LOCAL_STATIC_LIBRARIES := cpufeatures

include $(PREBUILT_STATIC_LIBRARY)

$(call import-module,android/cpufeatures)

1 个答案:

答案 0 :(得分:6)

与最初的印象(来自主题)相反,这不是(直接)Cannot load library: reloc_library[1285]: cannot locate 'rand'的副本。

似乎在使用--target=x86-android-gcc配置libvpx时,它实际上不会自动选择一个Android编译器或尝试使用android头文件(与它对armv7-android-gcc的作用相反)。 (事实上​​,如果你在OS X上用--target=x86-android-gcc编译,它甚至不构建linux / android二进制文件,它最终会为OS X构建一个二进制文件。)

相反,它使用普通的系统编译器,使用普通的系统编译器(除非你手动指定它们),包含一个普通的rand函数,这在Android上是不可用的。 (在5.0之前的Android版本上,rand中的stdlib.h函数是一个实际映射到lrand48函数的内联函数,这是二进制文件最终链接到的函数。)

(另外,当手机上安装android时,它似乎不允许你选择你所针对的Android版本,所以如果你的NDK包含android-21,它似乎会尝试用它来构建,也可以给你类似的错误,例如Cannot load library: reloc_library[1285]: cannot locate 'rand'。)

由于配置脚本魔术似乎没有为构建x86 android设置正确的东西(就像它为arm做的那样),你应该能够自己设置它,这需要设置更多的参数:

export PATH=<NDK>/toolchains/x86-4.8/prebuilt/*x86*/bin:$PATH
ASFLAGS="-D__ANDROID__" CROSS=i686-linux-android- LDFLAGS="--sysroot=<NDK>/platforms/android-9/arch-x86" ./configure --target=x86-android-gcc --extra-cflags="--sysroot=<NDK>/platforms/android-9/arch-x86" --disable-examples
make

有了这个,我就可以构建一个libvpx.a,它应该针对正确的标题构建,希望这对你来说很合适。