首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >加载使用本机代码的多个Java类版本

加载使用本机代码的多个Java类版本
EN

Stack Overflow用户
提问于 2016-10-13 08:51:33
回答 2查看 2.5K关注 0票数 2

如果您想加载一个类的多个版本,那么如果它们实现了一个共享接口,并且是在单独的JAR( 对每个版本使用单独的类加载器 )中,则可以这样做。

如果有一个调用本机代码的JAR,则可以在其JAR 从临时文件加载库中存储其本机代码的共享库(DLL)。

但如果两者兼而有之,会成功吗?如果JAR的两个版本都调用本机代码,并且都包含不同版本的共享库,会发生什么情况?

假设两个JAR使用不同的临时文件来存储共享库的副本。但是共享库的两个版本都有本机代码,它们调用具有相同声明的本机(C)函数(但这些函数的实现不同)。JVM/类加载器/System.load将从Java代码委托给正确的本机代码吗?或者JVM会抱怨名称冲突吗?

如果该方案确实失败,如何使用I使用使用本机代码的类的多个版本?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-14 05:08:11

在检查Open 7实现时,似乎是的,加载使用本机代码的多个版本的将工作:

库加载

关键的信息是,System.load是如何表现的?该方法的实现将依赖于系统,但各种实现的语义应该是相同的。

  1. System.load委托给包-私有方法Runtime.load0
  2. Runtime.load0委托给包-私有静态方法ClassLoader.loadLibrary
  3. ClassLoader.loadLibrary将委托给私有静态方法ClassLoader.loadLibrary0
  4. ClassLoader.loadLibrary0创建包的对象-私有内部类ClassLoader.NativeLibrary,并将其委托给它的load方法。
  5. ClassLoader.NativeLibrary.load是一个本机方法,它将委托给函数JVM_LoadLibrary
  6. JVM_LoadLibrary委托给os::dll_load
  7. os::dll_load是系统依赖的。
  8. os::dll_load将委托给dlopen系统调用,从而提供RTLD_LAZY选项。
  9. 默认情况下,Linux变体dlopen系统调用具有RTLD_LOCAL行为,因此共享库加载了RTLD_LOCAL语义。
  10. RTLD_LOCAL语义是指加载库中的符号不能用于随后加载的库的(自动)符号解析。也就是说,符号不进入全局命名空间,不同的库可以在不产生冲突的情况下定义相同的符号。共享库甚至可以毫无问题地拥有相同的内容。
  11. 因此,如果不同的共享库(由不同的类加载器加载)定义相同的符号(对于本机方法具有相同的extern函数名称)并不重要: JRE和JVM共同避免名称冲突。

本机函数查找

这确保共享库的多个版本不会产生名称冲突。但是,OpenJDK如何确保本机方法调用使用正确的JNI代码?

  1. 过程,JVM按照该过程调用本机方法。相当长,但它都包含在一个函数SharedRuntime::generate_native_wrapper中。但是,最终需要知道要调用的JNI函数的地址。
  2. 该包装器函数使用methodHandle C++对象,酌情从methodHandle::critical_native_function()methodHandle::native_function()获取JNI函数的地址。
  3. JNI函数的地址通过从methodHandle调用methodHandle::set_native_function记录在NativeLookup::lookup中。
  4. NativeLookup::lookup间接地委托给NativeLookup::lookup_style
  5. NativeLookup::lookup_style委托给Java私有静态方法ClassLoader.findNative
  6. ClassLoader.findNative按照加载库的顺序遍历ClassLoader.loadLibrary0设置的ClassLoader.NativeLibrary对象的列表(ClassLoader.nativeLibraries)。对于每个库,它委托NativeLibrary.find尝试查找感兴趣的本机方法。虽然这个对象列表不是公开的,但是JNI规范要求JVM“为每个类加载器维护一个加载的本机库列表”,所以所有实现都必须有类似于这个列表的东西。
  7. NativeLibrary.find是一种本地方法。它只是简单地委托给JVM_FindLibraryEntry
  8. JVM_FindLibraryEntry委托给系统相关方法os::dll_lookup
  9. os::dll_lookup的Linux实现委托给dlsym系统调用来查找共享库中函数的地址。
  10. 因为每个类加载器都维护自己的加载库列表,因此可以保证为本机方法调用的JNI代码将是正确的版本,即使不同的类加载器加载共享库的不同版本。
票数 5
EN

Stack Overflow用户

发布于 2016-10-14 03:31:31

如果您试图在不同的类加载器中加载相同的库,您将得到一个UnsatisfiedLinkError,它的消息是“本机库:.已经加载到另一个类加载器中了”。这可能与当类加载器被垃圾收集(方法)时调用库的卸载方法的VM有关。

但是,如果您--正如您所说--“使用不同的临时文件来存储共享库的副本”,那么这两个库实际上是不同的库,而不管文件的内容(可能是二进制相同的,这并不重要)。所以没什么问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40026804

复制
相关文章
pycharmimport时找不到指定文件_pycharm系统找不到指定文件
Error running ‘hello’: Cannot run program “B:\pystudy\venv\Scripts\python.exe” (in directory “\python-study”): CreateProcess error=2, 系统找不到指定的文件。
全栈程序员站长
2022/09/27
5.7K0
pycharmimport时找不到指定文件_pycharm系统找不到指定文件
Linux下gdb使用gdb命令时显示找不到文件
用户10551528
2023/10/18
8180
vue项目使用tinymce
TinyMCE官方推荐使用cdn进行加载,但是需要先购买才行,不想购买则只能悬着手动加载TinyMCE。
李郑
2020/02/17
1.8K0
JSF之经常使用注解
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116350.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
5800
Vue项目中使用Tinymce
最近因为公司项目的后台管理端需要实现编辑器功能, 一方面满足编辑各类文章内容需求,另一方面要自己编辑一些课程相关的介绍,于是就花了一些时间对比体验现有的一些开源的编辑器。
coder_koala
2019/07/30
4.8K0
Vue项目中使用Tinymce
mac 下 clang++ 找不到头文件 stdlib.h
探究原因: include_next是在当前文件所在的路径后面的路径(一般有多个搜索路径)里搜索头文件。 报错说明 clang++的 include 搜索路径里/usr/local/Cellar/llvm/7.0.0/include/c++/v1/ 后面的路径中不存在stdlib.h文件。
饶文津
2020/06/02
6.4K0
镜像打包时Dockerfile中要COPY的文件找不到
docker镜像打包的COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。 实际操作中正确的方式和错误的方式参考如下:
院长技术
2020/11/24
8.1K0
django中使用tinymce 富文本
安装完成之后,就可以在D:\python\Lib\site-packages\django_tinymce-2.7.0-py3.6.egg这个文件夹。
py3study
2020/01/16
1.3K0
django中使用tinymce 富文本
解决Python.h找不到问题
在linux系统上安装python的MySQLdb库时,提示 pip install MySQL _mysql.c:29:20: fatal error: Python.h: No such file or directory    #include "Python.h"                       ^   compilation terminated.   error: command 'gcc' failed with exit status 1 找不到Python.h,这是因为没有安
py3study
2020/01/06
8.7K0
Tinymce plugins [Tinymce扩展插件集合]
因为项目需要用到富文本编辑器众多富文本编辑器中,选择了 Tinymce,根据项目需要对Tinymce 进行扩展和增强插件,记录一下,并同时分享给需要帮助的人。
Fivecc
2022/11/20
2.8K0
Tinymce plugins [Tinymce扩展插件集合]
Django debug=False 时能找到静态文件的几种方式(静态文件找不到)
--help: --insecure   Allows serving static files even if DEBUG is False.
卓越笔记
2023/02/18
1.1K0
JS逆向 | JSF*ck,这个看着头大的加密其实很简单
我遇到过有两款网站用的就是 JSFuck 加密的,这个转换风格第一次遇到的时候内心OS就和这个名字一样。
龙哥
2020/03/05
1.2K0
JS逆向 | JSF*ck,这个看着头大的加密其实很简单
发现一个超好用的文本编辑器!!!
之前用的文本编辑器是mavonEditor,总是觉得看着md格式的内容怪怪的,于是乎发现了这么一款超好用的文本编辑器——TinyMCE
裴大头
2022/01/17
9490
UE4——找不到"UnLuaInterface.h"
如果你要引用插件中的头文件,那么一定需要在UE4项目名.build.cs中这里添加上插件名字:
太阳影的社区
2021/10/15
9190
JSF标签大全详解
藉由以下的几个主题,可以大致了解JSF的轮廓与特性,我们来看看网页设计人员与应用程序设计人员各负责什么。
一朵灼灼华
2022/08/05
1.5K0
java.io.FileNotFoundException关于使用Intellij Idea时系统找不到指定文件的解决方案
1、Intellij Idea 这个开发编辑神器(虽然我一点也不喜欢用它),在项目正常启动的时候,如果在你的webapp目录下的空文件夹它是不给你部署的。
别先生
2021/01/04
2.6K0
java.io.FileNotFoundException关于使用Intellij Idea时系统找不到指定文件的解决方案
vue2 renrne 引入tinymce[通俗易懂]
下载 地址 : https://www.tiny.cloud/get-tiny/self-hosted/
全栈程序员站长
2022/09/06
1.5K0
在页面使用富文本编译器
语言包下载:Language Packages | Trusted Rich Text Editor | TinyMCE
chao超的搬运文章
2023/10/15
3080
在页面使用富文本编译器
如何使用MyFace快速构建基于JSF的应用
如果大家使用Apache MyFace的JSF实现来搭建JSF应用,可以利用Apache提供的便捷maven方法来快速搭建一个初始的应用。
EltonZheng
2021/01/22
9620
使用 TinyMCE 编辑器中文语言配置过程
TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。
小狐狸说事
2022/11/17
3.6K0
使用 TinyMCE 编辑器中文语言配置过程

相似问题

使用<h:outputScript>在JSF中添加javascript代码

10

使用模板时的<h:outputScript>目标问题

12

如何通过h:outputScript包含JavaScript文件?

12

如何在远程文件中使用<h:outputScript />?

21

模板与<h:outputScript>

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文