내 프로젝트에서 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.
단일 "C"라이브러리를로드하는 것이 그 특정 장치를 제외한 모든 장치에서 작동하는 이유는 무엇입니까? – initramfs
나는 말할 수 없다. 어떤 장치를 테스트했는지, 그리고 라이브러리의 실제 이름을 모르겠습니다. –