你可以使用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加载的本机库使用,并且由于某种原因它没有将JavaVM *传递给您,您可以尝试这样的事情:
#include
#include
// ...
typedef jint (JNICALL * GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs;
// ...
jni_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(GetModuleHandle(
TEXT("jvm.dll")), "JNI_GetCreatedJavaVMs");