Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid - failure on loading library
    primarykey
    data
    text
    <p>I have a similar problem to <a href="https://stackoverflow.com/questions/2824820/unable-to-load-library-at-runtime-in-android-application">this question</a>, but slightly different. I have compiled a .so library to use with JNI. Because it is large (15 MB), I am putting it on the SDCard instead of in the standard application place.</p> <p>The file is called libSample.so and it's located at <code>/data/library/libSample.so</code></p> <p>I load it in a static initialization block:</p> <pre><code>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()); } </code></pre> <p>Here's the relevant logcat output:</p> <pre><code>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 </code></pre> <p>Any idea what's wrong?</p> <p>I read the post about <a href="https://stackoverflow.com/questions/3170619/can-android-load-dlls-from-sdcard-in-native-mode">can android load dll's from sdcard in native mode</a> which said that the sdcard cannot be used to load libraries, so I moved the .so into /data/data/com.example.hellojni/lib/libSample.so (the private app data storage location). No change:</p> <pre><code>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 </code></pre> <p>What I don't understand is that clearly the library exists, and the OS is trying to load it ... so what would make it fail?</p> <p>Following the advice of one of the commentors, I tried attaching via strace to get more detailed error information. The log can be found as a <a href="http://gist.github.com/588375" rel="nofollow noreferrer">github gist</a>.</p> <p>The error appears to be on lines 47-51:</p> <pre><code>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 </code></pre> <p>Here's the readelf of the library:</p> <pre><code>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 </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload