3

これは、Windows にのみ固有のものです。
JNIJavaVM*は、呼び出しプロセスのすべてのインスタンスを返す API を提供していますか?
次のシナリオを検討してください。C++ dll がプロセスに挿入されjava.exeます。JavaVM*問題は、C++ dllが実行元のプロセス内の現在のインスタンスをどのように見つけることができるかということです。

私の知る限り、すべての JNI 呼び出し APIには、右JNIEnvからしか取得できないオブジェクトが 必要ですか? http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.htmlJavaVM*

従来の取得方法JavaVM*は経由JNI_OnLoadですが、私は Java によって消費されるネイティブ ライブラリを作成していないので、それではうまくいかないと思います。 http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

4

1 に答える 1

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

このコードは、バッファの大きさを尋ねてから、データを取得するために 2 回目の呼び出しを行う「安全な」バージョンです。ただし、主要な Windows JVM (ホットスポット) はプロセスごとに複数の JVM をサポートしていないため、1 つの要素にバッファーを割り当てるだけで十分な場合があります。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");
于 2013-04-27T16:56:40.143 に答える