2015-01-18 1 views
3

libvpx으로 Android x86 용 webm 디코더를 사용하려고합니다.Android NDK에서 " 'rand'에 대한 정의되지 않은 참조를 반환합니다.

나는 다음 명령으로 라이브러리를 만들고 "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 

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) 

답변

6

, 이것은 아니다 (직접) Cannot load library: reloc_library[1285]: cannot locate 'rand'의 복제본.

libvpx를 --target=x86-android-gcc으로 구성 할 때 실제로는 자동으로 Android 컴파일러를 선택하거나 안드로이드 헤더를 사용하려고 시도하지 않습니다 (armv7-android-gcc의 경우와는 반대). 사실, OS X에서 --target=x86-android-gcc으로 컴파일하면 linux/android 바이너리도 빌드하지 않고 OS X 용 바이너리를 빌드하게됩니다.

대신 평소와 같이 일반 시스템 컴파일러 (정상적으로 시스템 헤더를 지정하지 않은 경우)는 Android에서 사용할 수없는 정상적인 rand 함수를 포함합니다. (5.0 이전의 안드로이드 버전에서, rand 함수는 stdlib.h은 이진 함수가 실제로 연결되는 인 lrand48 함수에 매핑되는 인라인 함수입니다.

(또한 팔에 안드로이드 용으로 빌드 할 때 대상으로하는 안드로이드 버전을 선택할 수있는 것처럼 보이지 않으므로 NDK에 android-21이 포함되어있는 경우 빌드하려고 시도하는 것으로 보입니다. 또한 Cannot load library: reloc_library[1285]: cannot locate 'rand'과 같은 유사한 오류를 줄 수 있습니다.

구성 스크립트 마법은 x86 용으로 빌드 할 때 올바른 작업을 설정하지 못했기 때문에 (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 

이렇게하면를 만들 수 있습니다.은 올바른 헤더에 대해 빌드되어야하며, 잘하면 잘 작동해야합니다.

+0

해당 명령은 빌드를 통과했지만 rand 오류가 발생합니다. 나는 또한 문제를 지속적으로 조사한다. – Tank2005

+1

아, 분명히 헤더를 검사하지 않지만'__ANDROID__' 정의를 확인하는 rand()를 호출하는 어셈블리 코드가 있습니다. configure 명령 (CROSS/LDFLAGS 부분의'./configure '부분 앞)에'ASFLAGS = "- D__ANDROID __"'를 추가하고 다시 빌드하십시오. – mstorsjo

+0

안녕하세요 @ mstorsjo ./configure 전에 ASFLAGS를 추가했는데 '인식 할 수없는 옵션'을 얻었습니다. -__ ANDROID __ '' – freddieptf

관련 문제