2014-03-04 2 views
1

버전 4.0.3의 경우 .so 라이브러리를 빌드하려고하지만 그렇게 할 수 없습니다. 내 .mk 파일이 라이브러리와 연결되어 있지 않기 때문에 이러한 문제가 발생한다고 생각합니다.Android Ndk에서 로컬 공유 라이브러리를 빌드 할 수 없습니다.

Android.mk 파일은

Binder.cpp \ 
BpBinder.cpp \ 
CursorWindow.cpp \ 
IInterface.cpp \ 
IMemory.cpp \ 
IPCThreadState.cpp \ 
IPermissionController.cpp \ 
IServiceManager.cpp \ 
MemoryDealer.cpp \ 
MemoryBase.cpp \ 
MemoryHeapBase.cpp \ 
MemoryHeapPmem.cpp \ 
Parcel.cpp \ 
PermissionCache.cpp \ 
ProcessState.cpp \ 
Static.cpp 

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_LDLIBS += -lpthread 
LOCAL_MODULE := libbinder1 
LOCAL_SHARED_LIBRARIES := liblog libcutils libutils 
LOCAL_SRC_FILES := $(sources) 
include $(BUILD_SHARED_LIBRARY) 

#include $(CLEAR_VARS) 
#LOCAL_CFLAGS += -DHAVE_PTHREADS 
#LOCAL_LDLIBS += -lpthread 
#LOCAL_MODULE := libbinder 
#LOCAL_SRC_FILES := $(sources) 
#include $(BUILD_STATIC_LIBRARY) 

이 파일은 나를 위해 정적 즉 .A 파일을 기반으로하지만, 공유 라이브러리를 구축하는 동안 쇼는 오류를 다음과 같습니다.

[armeabi] Compile++ thumb: binder1 <= IPCThreadState.cpp 
jni/IPCThreadState.cpp:292:8: error: 'pthread_mutex_t' does not name a type 
jni/IPCThreadState.cpp:294:8: error: 'pthread_key_t' does not name a type 
jni/IPCThreadState.cpp: In static member function 'static android::IPCThreadState*  android::IPCThreadState::self()': 

나는 LOCAL_CFLAGS를 사용하여 위의 오류를 수정 + = -DHAVE_PTHREADS

하지만 지금, 라이브러리 나 오류의 거대한 목록을 얻고 생성시.

D:/android-ndk-r9c-windows-x86/android-ndk-r9c/toolchains/arm-linux-androideabi-  4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux- androideabi/bin/ld.exe: error: cannot find -lpthread 
D:/android-ndk-r9c-windows-x86/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi/objs/binder1/Binder.o: in function android::Vector<android::String16>::do_copy(void*, void const*, unsigned int) const:jni/utils/TypeHelpers.h:142: error: undefined reference to 'android::String16::String16(android::String16 const&)' 

도움을 주실 수 있습니다.

+0

기록 할 것으로 예상된다? –

+0

ndk-build ... 나는 시스템 트리가 뭔지 모르겠다! 나는 NDK를 처음 사용합니다. – Mohit

+0

이 라이브러리는 어떻게해야하나요? 어디에서 코드베이스를 얻었습니까? –

답변

2

Android NDK는 pthread을 지원하지만 Linux toolchains에서는 보통과 같이 libpthread를 제공하지 않습니다. 당신이

LOCAL_CFLAGS += -DHAVE_PTHREADS 

를 사용하고 do_copy()에 정의되지 않은 참조에 관한 LOCAL_LDLIBS += -lpthread

를 추가하지 않을 경우 귀하의 첫 번째 오류 메시지는 시스템 라이브러리 libutils.so에서 유래 사라질 것입니다. 공식적으로 NDK로 출판되지 않은 라이브러리를 사용하는 것은 안전하지 않으므로 (here 참조)이 코드를 더 잘 재 작성하십시오.

Android.mk 파일은 google source 또는 해당 포크 중 하나에서 받았을 것입니다. 원래 라이브러리 libbinder.so에 상승 된 권한을 가진 시스템 앱이 필요하므로 앱을 시작할 때이로드되기 때문에 결과 라이브러리를 사용할 수 있을지는 의문입니다.

어쨌든 시스템 라이브러리를 LOCAL_SHARED_LIBRARIES으로 말하면 ndk-build과 작동하지 않습니다. 대신 LOCAL_SHARED_LIBRARIES := liblog libcutils libutils의 당신은 당신이, 또는`NDK-build`와 시스템 트리에서이 프로젝트를 구축하고

LOCAL_LDLIBS += -llog -lcutils -lutils 
+1

의 code.google.com에서 zip을 다운로드했습니다. 포스터가 NDK로 내 보내지 않은 플랫폼/AOSP- 내부 기능을 사용하려고하는 것 같습니다. 그러나 당신이 말하는 방식이 정확하지 않고 * exports * vs permissions *와 같은 문제를 혼동하는 것 같습니다. 예를 들어 타사 응용 프로그램의 프로세스를 살펴보면 libbinder.so가 의존성 (zygote에 의해 이미로드 된 것) - 제 3 자 코드가 직접 상호 작용하도록 의도되지는 않았지만 실제로는 승격 된 권한을 가진 시스템 앱이 필요하지 않으며, 유용하게 사용하기에는 까다로울 것입니다. –

+0

@ChrisStratton 설명해 주셔서 감사합니다. libbinder.so가 사용자 프로세스에로드 될 수 있음을 확인합니다. –

관련 문제