想要在 android 中使用它的 java 绑定 jnanomsg 实现 nanomsg 得到 java.lang.ExceptionInInitializerError

Want to implement nanomsg in android using its java binding jnanomsg getting java.lang.ExceptionInInitializerError

我正在尝试在 android 中实现 nanomsg,并且我从这个 link 获得了 java 绑定:http://niwinz.github.io/jnanomsg/ 在这个依赖项之后
编译 'jnanomsg:jnanomsg:0.4.3' 。它返回给我这个 sun/jna/libjnidispatch。所以没有找到。

一段时间后,我发现 jna 所需的“.so”文件丢失了,后来我从这个 link

中获得了所有必需的“.so”

https://github.com/java-native-access/jna/tree/master/dist 之后我将 libjnidispatch.so 文件复制到 app/src/main/jniLibs/armeabi-v7a/libjnidispatch.so 和

我在应用程序编译后通过 System.loadLibrary("jnidispatch") 加载了 so 文件。 当我尝试为 ReqSocket sock = new ReqSocket(); 创建对象时出现以下错误:

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)

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

谁能帮我看看我在这里犯了什么错误。 任何帮助将不胜感激。

看起来问题是没有 class 参数的 Native.register() 需要一个上下文 class 加载程序,它可以成功报告调用 class。 Android没有提供。

否则,Native.register() 需要您明确标识要注册的 class。不幸的是,如果它们的 registerstatic 块中,则可能甚至无法加载由 nanomsg 定义的 class。您需要复制他们的 class 定义(可大可小)并注册您自己的映射。或者要求他们修补他们的 register 调用以使用 Android.

另见 jna-users mailing list