这仅特定于 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(使用前将#替换为@)