2017-05-19 3 views
0

Ich mache ein Cordova-Plugin, das eine einfache Wrapper für eine .jar-Datei und ihre zwei .so Abhängigkeiten wäre. Ich habe es vorher in einer normalen Android-Anwendung mit Android Studio versucht. Durch das Kopieren der nativen Bibliotheken in den jniLibs/armeabi-Ordner und die jar-Datei in libs/funktionierte es perfekt.Native Bibliothek nicht von Cordova apk geladen

Am Cordova Plugin habe ich die gleiche Ordnerstruktur erstellt und alles ist am selben Ort. In der plugin.xml habe ich die zwei Dateien in libs/armeabi kopiert, was funktioniert, denn wenn ich in die apk schaue, sind sie im "richtigen" Ordner.

Aber wenn ich versuche, das Plugin von der cordova Anwendung verwenden sie eine UnsatisfiedLinkError wirft, wenn es die native Bibliothek zu nennen versucht:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.ionicframework.*******-2/base.apk"],nativeLibraryDirectories=[/data/app/com.ionicframework.*******-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libjni.so" 
W/System.err(4224): at java.lang.Runtime.loadLibrary(Runtime.java:366) 
W/System.err(4224): at java.lang.System.loadLibrary(System.java:988) 
W/System.err(4224): at *******.<clinit>(ComIO.java:407) 
W/System.err(4224): at *******.<init>(Printer.java:33) 
W/System.err(4224): at net.terbe.dev.cordova.*******.print(*******.java:54) 
W/System.err(4224): at *******.cordova.*******.execute(*******.java:42) 
W/System.err(4224): at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:98) 
W/System.err(4224): at org.apache.cordova.PluginManager.exec(PluginManager.java:132) 
W/System.err(4224): at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:57) 
W/System.err(4224): at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41) 
W/System.err(4224): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
W/System.err(4224): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:53) 
W/System.err(4224): at android.os.Handler.dispatchMessage(Handler.java:102) 
W/System.err(4224): at android.os.Looper.loop(Looper.java:135) 
W/System.err(4224): at android.os.HandlerThread.run(HandlerThread.java:61 

Wo soll ich diese Bibliotheken kopieren?

Antwort

1

Ich musste vor kurzem eine C-Bibliothek für die Verwendung in einer Cordova-App kompilieren, also habe ich basierend auf dieser Erfahrung eine example Cordova plugin und entsprechende test app that uses it erstellt.

Wenn Sie in meine plugin.xml schauen, werden Sie sehen, ich kopiere auch die armeabi Bibliothek zu /libs/armeabi, sowie die anderen Bibliotheken für die anderen Architekturen. Dieses Plugin funktioniert definitiv (Sie können es versuchen), also hoffentlich können Sie es als eine Arbeitsreferenz verwenden.

Dumme Frage: Sie kopieren nicht nur die armeabi Bibliothek? Weil ich mir ziemlich sicher bin, dass die meisten modernen Android-Geräte das nicht unterstützen (ARMv5/ARMv6) und armeabi-v7a benötigen, um in /libs/armeabi-v7a zu sein ...

+0

Danke. Ich habe nur diese beiden .so-Dateien vom Gerätehersteller in einem Ordner namens Armeabi neben dem Glas. Und die arbeiten von dort aus, wenn ich die Test-App in Android Studio mit der gleichen Ordnerstruktur baue. Ich werde versuchen, sie auch in die anderen Verzeichnisse zu kopieren. In der Ausnahme ist ein Ordner /lib/arm/aufgeführt. Bedeutet es, dass es versucht, sie von dort zu laden? – Perrier

+0

Sie hatten Recht. Ich musste die Binärdatei nur in libs/armeabi-v7a anstatt in libs/armeabi kopieren. Danke für Ihre Hilfe! – Perrier

+0

Dies funktioniert nicht für mich, wie ich in https://stackoverflow.com/questions/45546988/so-library-not-loaded-from-cordova-apk erklären. @Perrier können Sie bitte angeben, welche Cordova-Version und Android API-Ebene Sie verwenden? Vielen Dank! – franDayz

Verwandte Themen