2016-03-26 4 views
1
immer implementieren

Ich versuche nanomsg in Android zu implementieren und ich habe Java-Bindungen von diesem Link: http://niwinz.github.io/jnanomsg/ nach dieser Abhängigkeit
Kompilierung ‚jnanomsg: jnanomsg: 0.4 .3' . Es gab mir diese Sonne zurück/jna/libjnidispatch.so wurde nicht gefunden.Wollen nanomsg in Android mit seiner Java-Bindung jnanomsg java.lang.ExceptionInInitializerError

Nach einiger Zeit, die ich herausgefunden „.so“ Datei, die für jna erforderlich ist, fehlt später bekam ich alle erforderlichen „.so“ von diesem Link

https://github.com/java-native-access/jna/tree/master/dist danach kopiert i libjnidispatch.so-Datei app/src/main/jniLibs/armeabi-v7a/libjnidispatch.so und

Ich habe die so Datei von System.loadLibrary ("jnidispatch") geladen, nachdem diese App-Anwendung kompiliert wurde. Wenn ich versuche, für ReqSocket sock = new ReqSocket(); ein Objekt erstellen, verfolge ich Fehler bekommen:

java.lang.ExceptionInInitializerError 
        at nanomsg.Nanomsg.getSymbols(Nanomsg.java:35) 
        at nanomsg.Nanomsg.<clinit>(Nanomsg.java:48) 
        at nanomsg.Nanomsg$constants.<clinit>(Nanomsg.java:51) 
        at nanomsg.reqrep.ReqSocket.<init>(ReqSocket.java:13) 
        at com.example.nanomsg.onClick(MainActivity.java:125) 
        at android.view.View.performClick(View.java:5201) 
        at android.view.View$PerformClick.run(View.java:21163) 
        at android.os.Handler.handleCallback(Handler.java:746) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5443) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
        Caused by: java.lang.IllegalStateException: The SecurityManager implementation on this platform is broken; you must explicitly provide the class to register 
        at com.sun.jna.Native.getCallingClass(Native.java:1295) 
        at com.sun.jna.Native.register(Native.java:1252) 
        at nanomsg.NativeLibrary.<clinit>(NativeLibrary.java:30) 
        at nanomsg.Nanomsg.getSymbols(Nanomsg.java:35)  
        at nanomsg.Nanomsg.<clinit>(Nanomsg.java:48)  
        at nanomsg.Nanomsg$constants.<clinit>(Nanomsg.java:51)  
        at nanomsg.reqrep.ReqSocket.<init>(ReqSocket.java:13)  
        at com.example.nanomsg.MainActivity.onClick(MainActivity.java:125)  
        at android.view.View.performClick(View.java:5201)  
        at android.view.View$PerformClick.run(View.java:21163)  
        at android.os.Handler.handleCallback(Handler.java:746)  
        at android.os.Handler.dispatchMessage(Handler.java:95)  
        at android.os.Looper.loop(Looper.java:148)  
        at android.app.ActivityThread.main(ActivityThread.java:5443)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 

bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

Könnte jemand bitte helfen kann mir, welchen Fehler ich hier mache. Jede Hilfe wäre willkommen.

+0

Führen Sie die Systemeigenschaft 'jna.debug_load = true' und' jna.debug_load.jna = true' aus, um weitere Informationen zum Laden der Laufzeit zu erhalten. – technomage

+0

Hallo Technomage, ich habe meinen Beitrag bearbeitet, bitte überprüfe es einmal und danke für die Antwort. –

+0

Dies könnte helfen: https://groups.google.com/forum/#!topic/jna-users/mlUcaZZYkgQ – technomage

Antwort

1

Es sieht aus wie das Problem ist, dass Native.register() ohne ein Klassenargument erfordert ein Kontext-Klasse-Ladeprogramm, das die aufrufende Klasse erfolgreich melden kann. Android bietet keine an.

Ohne diese Angabe müssen Sie die Klasse, die Sie registrieren möchten, explizit mit Native.register() identifizieren. Leider kann es unmöglich sein, die durch nanomsg definierte Klasse zu laden, wenn sich ihr register in einem static Block befindet. Sie müssten ihre Klassendefinition (die klein oder groß sein könnte) kopieren und Ihr eigenes Mapping registrieren. Oder bitten Sie sie, ihren register Anruf mit Android zu bearbeiten.

Siehe auch jna-users mailing list.

+0

Dank Technomage hat es funktioniert. –

+0

@ rajesh-n: Hey, ist der resultierende Code irgendwo in einem Zweig verfügbar? – alanjds

Verwandte Themen