gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:50:51 24 4
gpt4 key购买 nike

这仅特定于 Windows。
JNI 是否提供任何 API 来返回调用进程的所有 JavaVM* 实例?
考虑以下场景,一个 C++ dll 被注入(inject)到一个 java.exe 进程中。现在的问题是,C++ dll 如何在它运行的进程中找到 JavaVM* 的当前实例?

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

获取 JavaVM* 的传统方法是通过 JNI_OnLoad 但由于我不是在编写一个由 Java 使用的 native 库,我认为这不会做的伎俩。 http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.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 (Hotspot) 不支持每个进程有多个 JVM,因此您只需为一个元素分配一个缓冲区就足够了。 JNI_GetCreatedJavaVMs 是调用 API 的一部分,因此由 jvm.dll 导出。

I'm not writing a native library to be consumed by Java

如果您要在您的库中创建 JVM,这就是您所需要的,因为无论如何您都必须加载 jvm.dll。我真的帮不了你太多,因为你没有写你的库将如何被调用。如果您的库被另一个创建 JVM 或从 JVM 加载的 native 库使用,并且它出于任何原因没有将 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");

关于java - 获取当前进程中的所有 JavaVM* 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16189049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com