2013-10-14 2 views
2

armeabi 및 armeabi7a 용으로 컴파일해야하는 작은 C++ 라이브러리가 있습니다. 또한 armeabi 용으로 컴파일해야하는 매우 큰 C++ 라이브러리가 있습니다. 현재 그들은 두 아키텍처에 대해 (NDK를 사용하여) 컴파일되고 있지만 이것이 .apk를 매우 크게 만들고 있습니다. armeabi 용으로 만 컴파일 될 큰 라이브러리를 타겟팅 할 수 있습니까? 어떻게하면 좋을까요?Android NDK : 다른 아키텍처에 대해 다른 라이브러리 컴파일

/jni/biglib/ 
/jni/smalllib/ 
/jni/Application.mk 
/jni/Android.mk 

내 /jni/Application.mk 파일이 포함되어 있습니다 :

APP_ABI := armeabi-v7a armeabi 
APP_OPTIM := release 

내 루트 /jni/Android.mk 파일이 Android.mk를 결합

내 폴더 구조는 다음과 같은 것입니다 각 도서관의 파일 :

LOCAL_PATH := $(call my-dir) 
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include 

include $(addprefix $(LOCAL_PATH)/, $(addsuffix /Android.mk, \ 
    biglib \ 
    smalllib \ 
)) 
+0

당신이 당신의 작은 도서관을 해킹 할 수 armeabi-V7A에 대한 libbiglib.so를 포함하지 않도록'armeabi' 버전 'armeabi7a' 장치에서 실행될 때 합리적으로 잘 작동합니까? – mvp

+0

제 생각에는 그렇게 생각하지 않습니다 ... 제 3 자 라이브러리이고 문서에서 armeabi7a에 대해 별도로 컴파일해야한다고합니다. – slamnjam

답변

4

확실히 가능합니다. biglib 및 smallib에 대한 Android.mk의 정확한 내용이 없으면 더 많은 도움을 줄 수있는 몇 가지 코드 스 니펫이 있습니다.

1) APP_ABI에서 APP_ABI := armeabi armeabi-v7a까지의 순서를 Application.mk에서 변경하십시오.

2) 루트 Android.mk 수정 :

LOCAL_PATH := $(call my-dir) 
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include 

# biglib is not built for armeabi-v7a 
ifneq "$(TARGET_ARCH_ABI)" "armeabi-v7a" 
    include $(LOCAL_PATH)/biglib/Android.mk 
endif 

# ----- cut here ----- 
# Place this snippet to every module which needs biglib, or where convenient. 
# Now you will link against armeabi version of biglib. 
ifeq "$(TARGET_ARCH_ABI)" "armeabi-v7a" 
    LOCAL_LDFLAGS += $(LOCAL_PATH)/../obj/local/armeabi/libbigLib.so 
endif 
# ----- cut here ----- 

include $(LOCAL_PATH)/smalllib/Android.mk 

그리고 모든 먹으 렴을 - 당신의 apk 파일이 지금

+0

이 작업은 컴파일 작업에 사용되었지만 이제는 armeabi-v7 전화 런타임에서 충돌이 발생합니다. armeabi-v7a 폴더에서 libbiglib.so를 찾고 찾지 못했습니다. v7 전화에서 armeabi 버전을 기본으로 설정하는 방법이 있습니까? java.lang.UnsatisfiedLinkError : biglib를로드 할 수 없습니다. findLibrary는 java.lang.Runtime.loadLibrary (Runtime.java:429)에서 null을 반환했습니다. – slamnjam

+0

@slamnjam : 로그에서 찾을 수없는 라이브러리를 말하며, 어떤 디렉토리에? 정적 생성자에 두 개의'system.load()'문이 있습니까? –

+0

@AlexCohn 예, 각 라이브러리는 관련 라이브러리가 정적 생성자에로드 된 다른 클래스에서 사용 중입니다. 사실, 장치를 확인했는데 큰 라이브러리는 장치의 libs 폴더에도 설치되지 않았습니다. 이 문제를 해결하기 위해 새로운 질문을 만들었습니다. http://stackoverflow.com/questions/19366009/android-ndk-use-same-library-across-different-abi-architectures – slamnjam

관련 문제