Issue
I'm currently developing an Android app that utilizes an existing native library written in C.
I managed to run the app on a Motorola Moto G2 (Android 6.0, armeabi-v7a), but on a Galaxy S2 (Android 4.1.2, also armeabi-v7a) I always get a DllNotFoundException.
When I run adb shell ls -l /data/data/com.my.app/lib I can see that the libmyutils.so is extracted from the respective ABI lib folder.
In the debug log is can see a lot of lines like this:
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library './libmyutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib/./libmyutils' not found'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library './libmyutils.so': 'Cannot load library: find_library[1202]: 138 'libmyutils.so' failed to load previously'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library '/system/lib/libmyutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib//system/lib/libmyutils' not found'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library '/system/lib/libmyutils.so': 'Cannot load library: find_library[1202]: 138 'libmyutils.so' failed to load previously'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library 'libmyutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib/libmyutils' not found'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library 'libmyutils.so': 'Cannot load library: find_library[1202]: 138 'libmyutils.so' failed to load previously'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library 'myutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib/myutils' not found'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library './libmyutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib/./libmyutils' not found'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library './libmyutils.so': 'Cannot load library: find_library[1202]: 138 'libmyutils.so' failed to load previously'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library '/system/lib/libmyutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib//system/lib/libmyutils' not found'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library '/system/lib/libmyutils.so': 'Cannot load library: find_library[1202]: 138 'libmyutils.so' failed to load previously'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library 'libmyutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib/libmyutils' not found'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library 'libmyutils.so': 'Cannot load library: find_library[1202]: 138 'libmyutils.so' failed to load previously'.
01-25 15:44:55.397 D/Mono (27537): DllImport error loading library 'libmyutils': 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib/libmyutils' not found'.
01-25 15:44:55.397 W/Mono (27537): DllImport unable to load library 'Cannot load library: load_library[1094]: Library '/data/data/com.my.app/lib/libmyutils' not found'.
Is this a compiler/architecture issue?
I'm looking forward to your help!
Best, Marco
UPDATE: Solution
Finally it works! On the Galaxy S2 Android 4.1.2 I tried to call a native function by using the DllImport attribute and specified the library as myutils. After I had changed myutils to libmyutils.so the App was able to find the library. Unfortunately, it couldn't find a dependency library libdep1.so. What I did was to load the libraries in the correct order at startup using Java.Lang.JavaSystem.LoadLibrary("dep1") and then Java.Lang.JavaSystem.LoadLibrary("myutils"). This works even without the lib and .so pre-/suffix using only the library name. I could also switch back to from libmyutils.so to myutils in the DllImport attribute library name.
Solution
Old versions of Android had a bug in the linker where you had to load your native libraries in a specific order or they wouldn't load properly.
The best way to solve this is to use ReLinker. If you aren't using Java, the NDK ships a tool called ndk-depends that will tell you the correct load order for your shared libraries.
Note that you'll probably need to explicitly use Java.Lang.JavaSystem.LoadLibrary rather than DllImport.
Answered By - Dan Albert
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.