Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI-我可以在不调用System.loadLibrary的情况下使用RegisterNative插件吗? 我有一个使用插件的C++应用程序(它动态加载某些共享的LIB文件)。我在理解从Java调用动态加载的本机代码时遇到了一些困难_Java_Android_C++_Java Native Interface - Fatal编程技术网

JNI-我可以在不调用System.loadLibrary的情况下使用RegisterNative插件吗? 我有一个使用插件的C++应用程序(它动态加载某些共享的LIB文件)。我在理解从Java调用动态加载的本机代码时遇到了一些困难

JNI-我可以在不调用System.loadLibrary的情况下使用RegisterNative插件吗? 我有一个使用插件的C++应用程序(它动态加载某些共享的LIB文件)。我在理解从Java调用动态加载的本机代码时遇到了一些困难,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,我是否必须使用System.loadLibrary/System.load“预加载”本机共享对象(“插件”)才能调用该本机代码?或者在我的本地代码中加载后,我可以只从插件中调用RegisterNatives吗?我已经为我的主要本机应用程序库调用了System.loadLibrary——这是本机库加载的后续插件 如果我可以只调用registernations,那么如果我突然决定卸载一个插件,JVM尝试调用其中的本机方法,会发生什么呢?至少Android VM要求在实例化类时,所有本机方法都必须“注

我是否必须使用System.loadLibrary/System.load“预加载”本机共享对象(“插件”)才能调用该本机代码?或者在我的本地代码中加载后,我可以只从插件中调用RegisterNatives吗?我已经为我的主要本机应用程序库调用了System.loadLibrary——这是本机库加载的后续插件


如果我可以只调用registernations,那么如果我突然决定卸载一个插件,JVM尝试调用其中的本机方法,会发生什么呢?

至少Android VM要求在实例化类时,所有本机方法都必须“注册”。这就是为什么通常在静态构造函数中调用
System.load()
,而不是稍后调用的原因

解析本机方法的两种方法是通过
JNI_OnLoad()
中的
RegisterNatives()
或通过名称匹配(C导出的函数名称由
javah
报告)

您可以在所有加载的模块中查找
RegisterNatives()
的函数指针,或者加载更多模块并从中获取指针
RegisterNatives()
可以随时调用,如果您确实想卸载一些插件,可以使用
UnregisterNatives()

引入后者是为了支持以下流(伪代码如下所示):


如果您的应用程序尝试使用在卸载的插件中实现的本机方法,或者在使用
UnregisterNatives()
注销本机()注销后,可能会严重崩溃。我不相信最初的一句话是真的,好像是真的一样,声明本机方法并在以后(但在使用之前)加载实现是不起作用的。事实上,如果跳过加载,则运行时异常仅在尝试使用缺少的方法时发生,而不是在实例化它所属的类时发生。@chris stratton:你是说Android实现吗?只要我事先加载了所有的类ID,加载本机插件后调用RegisterNatives似乎可以正常工作
SwitchPlugin() {
    UnregisterNatives();
    unloadPlugin(oldHandle);
    newHandle = loadPlugin(newPluginName);
    RegisterNatives();
}