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

ain*_*ins 3 c++ java windows java-native-interface

这仅适用于Windows.
JNI是否提供任何返回JavaVM*调用进程的所有实例的API ?
考虑以下场景,将C++ dll注入java.exe进程.现在的问题是,C++ DLL如何JavaVM*在其运行的进程中找到当前实例?

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

传统的获取方式JavaVM*是通过,JNI_OnLoad但由于我不是在编写一个由Java使用的本机库,所以我认为不会这样做. http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

mai*_*n-- 5

你可以使用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
Run Code Online (Sandbox Code Playgroud)

此代码是"安全"版本,它询问缓冲区的大小,然后再次调用以获取数据.但是,主要的Windows JVM(Hotspot)每个进程不支持多个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");
Run Code Online (Sandbox Code Playgroud)