我正在使用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)
答案 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
,它应该针对正确的标题构建,希望这对你来说很合适。