Connetti a JVM già in esecuzione

C’è un modo per collegarsi a una JVM già in esecuzione?

Ad esempio, in JNI è ansible utilizzare JNI_CreateJavaVM per creare una VM ed eseguire un jar e ispezionarne tutte le classi.

Tuttavia, se il jar è già in esecuzione, non riesco a trovare un modo per collegarlo alla sua JVM e comunicare con le sue classi o ottenere il suo puntatore env ..

Un altro problema è che se il jar carica la mia libreria nativa (.dll) e voglio creare una JVM all’interno del dll, non posso .. Né posso albind la JVM attuale del jar senza il jar che chiama la mia funzione ..

Esempio sul lato Java:

 class Foo { static {loadLibrary("Foo")} } 

sul lato C ++:

 void Foo() { //CreateJVM //Attach to the current process.. //Call function from the jar that loaded me. } 

Questo non può essere fatto senza che il jar chiami prima Foo .

Qualche idea? Non c’è modo di ottenere la JVM corrente o di allegarla ad essa o ad un’istanza di jvm esterna?

Si, puoi.

1) Inietti una DLL nel processo che ospita la JVM (ad es. java.exe o javaw.exe o iexplore.exe ). Una tecnica di iniezione comune è usare SetWindowsHookEx

2) Nella DLL, ottieni l’handle del modulo di jvm.dll usando GetModuleHandle

3) Ottieni l’indirizzo della funzione JNI_GetCreatedJavaVMs , utilizzando GetProcAddress

4) Chiamare la funzione e, in caso di successo, colbind il thread alla prima JVM trovata, utilizzando il puntatore della funzione AttachCurrentThread dallo struture JavaVM .

5) Fatto.

Link utili: l’API di chiamata

No, non puoi. JNI consente esattamente due modelli:

  • Il tuo programma non Java crea la JVM.
  • Il tuo programma Java invoca un metodo nativo.

Se è necessario comunicare in altri casi, sarà necessario utilizzare un altro meccanismo. I servizi Web sono un approccio semplice.