JNI-我可以在不为本机插件调用System.loadLibrary的情况下使用RegisterNatives吗
JNI - Can I use RegisterNatives without calling System.loadLibrary for native plugins?
我有一个使用插件的C++应用程序(它动态加载某些共享的lib文件)。我很难理解从Java调用动态加载的本机代码需要做什么。
我是否有使用System.loadLibrary/System.load来"预加载"本机共享对象("插件"),以便能够调用该本机代码?或者,在将插件加载到我的本机代码中后,我只可以从插件中调用RegisterNatives吗?我已经为我的主要本机应用程序库调用了System.loadLibrary——它是本机库加载的后续插件,这个问题就是为了这个插件。
如果我可以只调用RegisterNatives,如果我突然决定卸载一个插件,JVM尝试调用其中的本机方法,会发生什么?
至少Android VM要求在实例化类时必须"注册"所有本机方法。这就是为什么System.load()
通常在静态构造函数中调用,而不是稍后调用。
解析本机方法的两种方法是通过JNI_OnLoad()
中的RegisterNatives()
或通过名称匹配(javah
报告的C导出函数名称)。
您可以在所有加载的模块中查找RegisterNatives()
的函数指针,也可以加载更多模块并从中获取指针。RegisterNatives()
可以在任何时候被调用,如果你真的想卸载一些插件,你可以使用UnregisterNatives()
。
后者是为了支持以下流程而引入的(伪代码如下):
SwitchPlugin() {
UnregisterNatives();
unloadPlugin(oldHandle);
newHandle = loadPlugin(newPluginName);
RegisterNatives();
}
如果您的应用程序试图使用在卸载的插件中实现的本机方法,或者在使用UnregisterNatives()
注销后,它可能会崩溃。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在C++中如何在没有pow的情况下进行基础计算
- 松弛原子与无同步情况下的记忆连贯性
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- JNI-我可以在不为本机插件调用System.loadLibrary的情况下使用RegisterNatives吗