У меня есть проблема, аналогичная этому вопросу , но немного другая. Я скомпилировал .so библиотеку для использования с JNI. Поскольку он большой (15 МБ), я помещаю его на SDCard вместо стандартного приложения.
Файл называется libSample.so и он ' находится в /data/library/libSample.so
Я загружаю его в блок статической инициализации:
try {
File sdcard = Environment.getExternalStorageDirectory();
File libraryLoc = new File(sdcard.getAbsolutePath() + "/library/libSample.so");
Log.i("Library", "Does the library exist?" + libraryLoc.exists());
System.load(libraryLoc.getAbsolutePath());
}
catch (UnsatisfiedLinkError e) {
Log.e("Translator", e.getMessage());
Log.e("Translator", e.toString());
}
Вот соответствующий вывод logcat:
09-02 16:42:58.882: DEBUG/dalvikvm(4185): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8
09-02 16:42:58.892: DEBUG/dalvikvm(4185): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8
09-02 16:42:58.892: DEBUG/dalvikvm(4185): No JNI_OnLoad found in /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8
09-02 16:42:58.892: INFO/Library(4185): Library exists: true
09-02 16:42:58.902: INFO/Library(4185): Library can be read: true
09-02 16:42:58.902: DEBUG/dalvikvm(4185): Trying to load lib /sdcard/library/libSample.so 0x434fb6f8
09-02 16:42:58.902: INFO/dalvikvm(4185): Unable to dlopen(/sdcard/library/libSample.so): Cannot find library
09-02 16:42:58.912: ERROR/Translator(4185): Library /sdcard/library/libSample.so not found
09-02 16:42:58.912: ERROR/Translator(4185): java.lang.UnsatisfiedLinkError: Library /sdcard/library/libSample.so not found
Есть идеи, что не так?
Я прочитал пост Около может Android загружать DLL из SDCard в основном режиме , который сказал, что SDCard не может использоваться для загрузки библиотек, поэтому я переместил .so в /data/data/com.example.hellojni/lib/libSample. так (место хранения данных частного приложения). Без изменений:
09-02 16:53:18.332: DEBUG/dalvikvm(4515): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8
09-02 16:53:18.342: DEBUG/dalvikvm(4515): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8
09-02 16:53:18.342: DEBUG/dalvikvm(4515): No JNI_OnLoad found in /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8
09-02 16:53:18.352: INFO/Library(4515): Library exists: true
09-02 16:53:18.352: INFO/Library(4515): Library can be read: true
09-02 16:53:18.352: DEBUG/dalvikvm(4515): Trying to load lib /data/data/com.example.hellojni/lib/libSample.so 0x434fb6f8
09-02 16:53:18.482: INFO/dalvikvm(4515): Unable to dlopen(/data/data/com.example.hellojni/lib/libSample.so): Cannot find library
09-02 16:53:18.492: ERROR/Translator(4515): Library /data/data/com.example.hellojni/lib/libSample.so not found
09-02 16:53:18.492: ERROR/Translator(4515): java.lang.UnsatisfiedLinkError: Library /data/data/com.example.hellojni/lib/libSample.so not found
Чего я не понимаю, так это того, что библиотека существует, и ОС пытается ее загрузить ... так что же может привести к сбою?
Следуя совету одного из комментаторов, я попытался подключиться через strace, чтобы получить более подробную информацию об ошибке. Журнал можно найти как github gist .
Ошибка, кажется, в строках 47-51:
mprotect(0x4235d000, 4096, PROT_READ) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbeb58080) = -1 ENOTTY (Not a typewriter)
write(1, "bionic/linker/linker.c:1243| ERROR: 34 unknown reloc type 3 @ 0x811a854c (2441)\n", 83) = 83
write(1, "bionic/linker/linker.c:1641| ERROR: failed to link /data/data/com.example.hellojni/lib/libSample.so\n", 100) = 100
munmap(0x81000000, 8839168) = 0
Здесь ' s readelf библиотеки:
arm-eabi-readelf -d libSample.so
Dynamic section at offset 0x80b648 contains 17 entries:
Tag Type Name/Value
0x00000019 (INIT_ARRAY) 0x7ff234
0x0000001b (INIT_ARRAYSZ) 76 (bytes)
0x00000004 (HASH) 0xd4
0x00000005 (STRTAB) 0x7f41c
0x00000006 (SYMTAB) 0x2650c
0x0000000a (STRSZ) 1197287 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000003 (PLTGOT) 0x80c6f0
0x00000002 (PLTRELSZ) 76480 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x1ccb84
0x00000011 (REL) 0x1a3904
0x00000012 (RELSZ) 168576 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x00000016 (TEXTREL) 0x0
0x6ffffffa (RELCOUNT) 2412
0x00000000 (NULL) 0x0