获取当前进程中 JavaVM* 的所有实例?

2023-12-09

这仅特定于 Windows。
JNI 是否提供返回所有实例的 APIJavaVM*调用过程?
考虑以下场景,将 C++ dll 注入到java.exe过程。现在的问题是,C++ dll如何定位当前的实例JavaVM*在它运行的进程内?

据我所知,所有 JNI 调用 API 都需要一个JNIEnv只能从以下位置获取的对象JavaVM* right? http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

传统的获取方式JavaVM* is via JNI_OnLoad但由于我没有编写供 Java 使用的本机库,所以我认为这不会起作用。http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/inplication.html


您可以使用JNI_GetCreatedJavaVMs:

jsize nVMs;
JNI_GetCreatedJavaVMs(NULL, 0, &nVMs); // 1. just get the required array length
JavaVM** buffer = new JavaVM*[nVMs];
JNI_GetCreatedJavaVMs(buffer, nVMs, &nVMs); // 2. get the data

此代码是“安全”版本,它询问缓冲区必须有多大,然后第二次调用以获取数据。然而,主要的 Windows JVM(热点)不支持每个进程多个 JVM,因此您只需为一个元素分配一个缓冲区就足够了。JNI_GetCreatedJavaVMs是调用 API 的一部分,因此由jvm.dll.

我不是在编写供 Java 使用的本机库

如果您要在库中创建 JVM,那么这就是您所需要的,因为您必须加载jvm.dll无论如何。我真的帮不了你太多,因为你没有写出你的库将如何被调用。如果您的库被另一个创建 JVM 或从 JVM 加载的本机库使用,并且它没有通过JavaVM*无论出于何种原因,你都可以尝试这样的事情:

#include <Windows.h>
#include <jni.h>
// ...
typedef jint (JNICALL * GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs;
// ...
jni_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(GetModuleHandle(
        TEXT("jvm.dll")), "JNI_GetCreatedJavaVMs");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取当前进程中 JavaVM* 的所有实例? 的相关文章

随机推荐

  • 使用java更改mysql日期时间格式以生成JasperReports

    我正在使用 JasperReportsiReport 4 5 0设计师来构建我的报告 我的时间戳字段有一个问题startDate and endDate 在我的设计师中我改变了格式startDate and endDate使用模式 But
  • 如何使用java反射查找成员的访问修饰符

    使用java反射查找成员的访问修饰符 private final static long serialId 1L protected String title public String FirstName 我需要知道哪个变量是私有的 受保
  • 为什么集合初始化会抛出 NullReferenceException

    下面的代码抛出一个NullReferenceException internal class Foo public Collection
  • PDFBox如何从另一个pdf导入acrofield

    我在将现有的 acrofield 从 pdf 导入到另一个 pdf 时遇到问题 两个pdf很相似 我尝试导入并保存文件 代码如下 如果我从文件系统打开它 我看不到更改 但如果我使用 pdfbox 打开它 我会看到之前插入的 acrofile
  • 在 spring 中将值从控制器传递到 html

    您好 我有一个简单的网页 其中有一个按钮和按钮附近的文本 单击按钮时我需要更改文本并从代码中获取新文本 这是我需要传递响应的控制器类 GetMapping stream public String openStream Model mode
  • Dnsmasq 无故停止工作

    我开始在 OSX Yosemite 上使用 Dnsmasq 将所有 dev 域解析为 192 168 10 10 IP 地址 这是 Laravel Homestead 的默认地址 它对我有用 但在睡眠并唤醒我的 Macbook 后 它停止工
  • EditText 的实时字符计数

    我想知道在 Android 中对编辑文本框进行实时字符计数的最佳方法是什么 我在看this但我似乎无法理解它 为了描述这个问题 我有一个 EditText 我试图将字符限制为 150 个 我可以使用输入过滤器来做到这一点 但是我想在文本框正
  • 如何使用 nuget.core 获取包大小?

    我想知道是否有办法在下载之前知道包的大小 我正在使用 nuget 包来部署组件 并且了解更新的大小将是一个很好的功能 包大小在从服务器返回的响应中返回NuGet图库包源码
  • Pandas 数据框按索引选择行,按名称选择列

    有没有办法在 pandas 数据框中按索引 即整数 选择行并按列名称选择列 我尝试使用 loc 但它返回一个错误 并且我了解 iloc 仅适用于索引 这是数据框 df 的第一行 我愿意选择第一行 名为 Volume 的列并尝试使用 df l
  • 通过历史记录向后移动,跳过具有不同查询字符串的同一页面

    当我刷新页面或使用相同的 URL 重定向到同一页面时 我可以单击带有 window history back 的按钮代码并返回上一页 但是 如果查询字符串已更改 当我尝试返回时 我只会返回同一页面 示例1 page1 html gt pag
  • 如何在 emacs 中关闭 vhdl 模式?

    我现在正在学习 emacs 并尝试编写一个简单的 vhdl 程序进行测试 我可以看到 vhdl 模式可能是一个有趣的功能 但我想知道如何暂时关闭它以及稍后如何重新激活它 使用命令M x 基本模式 那是 按下 并按住 meta键 通常是Alt
  • 访问由文件夹引用添加的 Swift 变量

    事实上 我在这个简单的问题上花了大约 3 个小时 并用 google 搜索了很多 但没有办法 我的问题很简单 我想将一个目录作为 文件夹引用 添加到我的 Swift xCode 项目中 但无法访问它们 我不需要添加然后使用组引用 有什么建议
  • 如何仅由单个用户发布 Facebook 用户墙/页面状态 不为其他用户安装应用程序

    我正在一个网站上工作 如果在该网站上发布了某些内容 我需要将页面链接从该网站发布到特殊的用户墙或页面 这意味着我只需要一个用户来发布该问题 我面临的问题是访问令牌 因为我不想在网站流量前面显示 Facebook 登录页面 它不像在用户墙上共
  • 如何让Maven下载特定依赖项的源代码和javadoc?

    我需要特定的依赖项文档 一些文档和源代码 告诉 Maven 这样做的最佳方法是什么 首先 IntelliJ 应该自动为您下载源代码 尽管有时您可能需要单击 下载源代码 这实际上使用 Maven 来获取源代码和 javadoc 如果您想使用
  • 角度路线开始和路线结束事件

    我如何访问路由开始和路由结束事件 我想在路由和加载数据时显示进度栏 有人能告诉我这是如何工作的吗 如果您更喜欢使用可观察的 import Router NavigationStart from angular router construc
  • 如何从电子表格编写 Google 表单脚本以根据答案转到特定页面?

    我已经成功创建了一个 Google 表单 该表单使用从此处改编的代码从电子表格填充 https www youtube com watch v BYA4URuWw0s 现在我想让表单根据上一个问题的答案转到一个特定的问题 而不失去从电子表格
  • 引起原因:java.net.NoRouteToHostException:没有到主机的路由

    我正在尝试在 openshift 上从 eclipse 部署我的 Jersey 项目 并且在尾部文件中收到此错误Caused by java net NoRouteToHostException No route to host 以前当我有
  • 如何在php中获取会议邀请电子邮件的回复

    我正在向用户的电子邮件发送日历会议邀请 当接收者接受邀请时 它会出现在接收者日历中 但我无法得到回复 有什么方法可以获得回复并在我的网站中使用它 在这种情况下 Google 服务帐户是完美的解决方案 在这种情况下 用户不需要任何 API 详
  • 如何将 Action Listener 设置为 3 个按钮

    我正在尝试制作一个带有三个按钮的秒表 开始 暂停 和 停止 我的老师只教我们如何将动作监听器设置为两个按钮 如何为三个按钮设置动作监听器 这是到目前为止我的编码 JButton startButton new JButton Start J
  • 获取当前进程中 JavaVM* 的所有实例?

    这仅特定于 Windows JNI 是否提供返回所有实例的 APIJavaVM 调用过程 考虑以下场景 将 C dll 注入到java exe过程 现在的问题是 C dll如何定位当前的实例JavaVM 在它运行的进程内 据我所知 所有 J