1

내 프로젝트에서 3 번째 공유 라이브러리를로드해야합니다.이 3 가지 공유 라이브러리는 처음 두 번째 공유 라이브러리에 의존합니다. 단순화를 위해 첫 번째 두 개는 A & B이고 나머지 세 번째 C는Android NDK/JNI : 종속 공유 라이브러리가있는 loadLibrary 오류

입니다. 라이브러리 A와 B는 JNI를 통해 상호 작용하지 않으며 단순히 안드로이드에 대한 기존 라이브러리의 포트입니다.

I는 다음과 같은 세 번째 라이브러리의 android.mk를 설정하여 문제없이 이러한 시스템을 설정 한 :

include $(CLEAR_VARS) 

LOCAL_PATH := $(MY_LOCAL_PATH) 

LOCAL_MODULE := C 
LOCAL_SRC_FILES := <source files> 

LOCAL_C_INCLUDES := $(MY_LOCAL_PATH)/libA/ 
LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/libB/ 
LOCAL_SHARED_LIBRARIES := A 
LOCAL_SHARED_LIBRARIES += B 
LOCAL_LDLIBS += -llog 

include $(BUILD_SHARED_LIBRARY) 

내가 사용했습니다 자바를 통해이 라이브러리로드 :

static{ 
    System.loadLibrary("C"); 
} 

로를 많은 성공.

static{ 
    System.loadLibrary("A"); 
    System.loadLibrary("B"); 
    System.loadLibrary("C"); 
} 

보인다 : 내 코드를 변경

java.lang.ExceptionInitializerError 
    at <source>:<line> 
    at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1892]: 1909 could not load needed library 'libA.so' for 'libC.so' (load_library[1094]: Library 'libA.so' not found) 
    at java.lang.Runtime.loadLibrary(Runtime.java:370) 
    at java.lang.System.loadLibrary(System.java:535) 
    at <source>:<line> 
... 

:

이 시스템은 스택 추적에 UnsatisfiedLinkError를받은 내 베타 테스터 중 하나를 제외한 모든에뿐만 아니라 내 장치에서 작동 테스터의 문제를 해결할 수 있습니다.

문제가있는 테스터는 armeabi-v7a (내 장치와 동일)에서 실행중인 Android 4.1.2 (내 기본 코드에서 지원)가있는 Samsung Galaxy SIII를 사용했습니다.

단일 "로드 C"가 테스터의 장치에 문제가 있거나 3 개의 라이브러리를 모두 명시 적으로로드하는 "올바른"방법인가? 그리고 왜 그 장치에 실패했을까요? 모든 명시 적으로 적재 대 한 "부하 C"에 대한

로그 캣 : 적재 대

07-26 23:23:29.333: D/App(13753): Loading core... 
07-26 23:23:29.333: D/dalvikvm(13753): Trying to load lib /data/app-lib/com.foo.bar.app-2/libC.so 0x41bfd598 
07-26 23:23:29.333: D/dalvikvm(13753): Added shared lib /data/app-lib/com.foo.bar.app-2/libC.so 0x41bfd598 
07-26 23:23:29.338: D/App(13753): Core loaded. 

모든 :

07-26 23:17:50.193: D/App(12714): Loading core... 
07-26 23:17:50.198: D/dalvikvm(12714): Trying to load lib /data/app-lib/com.foo.bar.app-1/libA.so 0x41bfaf20 
07-26 23:17:50.198: D/dalvikvm(12714): Added shared lib /data/app-lib/com.foo.bar.app-1/libA.so 0x41bfaf20 
07-26 23:17:50.203: D/dalvikvm(12714): No JNI_OnLoad found in /data/app-lib/com.foo.bar.app-1/libA.so 0x41bfaf20, skipping init 
07-26 23:17:50.208: D/dalvikvm(12714): Trying to load lib /data/app-lib/com.foo.bar.app-1/libB.so 0x41bfaf20 
07-26 23:17:50.208: D/dalvikvm(12714): Added shared lib /data/app-lib/com.foo.bar.app-1/libB.so 0x41bfaf20 
07-26 23:17:50.208: D/dalvikvm(12714): No JNI_OnLoad found in /data/app-lib/com.foo.bar.app-1/libB.so 0x41bfaf20, skipping init 
07-26 23:17:50.208: D/dalvikvm(12714): Trying to load lib /data/app-lib/com.foo.bar.app-1/libC.so 0x41bfaf20 
07-26 23:17:50.208: D/dalvikvm(12714): Added shared lib /data/app-lib/com.foo.bar.app-1/libC.so 0x41bfaf20 
07-26 23:17:50.208: D/App(12714): Core loaded. 

답변

1

예,로드 명시 적으로 A, B와 C는 올바른 방법으로는 Android에서 작동합니다. 또 다른 방법은 NDK r9부터 지원되는 crazy linker을 사용하는 것입니다.

어쨌든 시스템 라이브러리가 우연히 사용되지 않도록 프로젝트에서 사용하는 라이브러리에 특별한 이름을 선택하는 것이 중요합니다. 예 : Android 기기의 libcrypto.solibssl.so/system/lib이지만 많은 앱에는 최신 버전이 필요합니다.

UPDATE : 미친 링커는 NDK에서 removed했지만, 그것은 in chromium project (latest change: June 2017를) 찾을 수 있습니다.

+0

단일 "C"라이브러리를로드하는 것이 그 특정 장치를 제외한 모든 장치에서 작동하는 이유는 무엇입니까? – initramfs

+0

나는 말할 수 없다. 어떤 장치를 테스트했는지, 그리고 라이브러리의 실제 이름을 모르겠습니다. –