¿Se puede crear una nueva JVM en una función de C ++ llamada desde Java utilizando JNI?

Entonces, mi configuración es que tengo un .dll desarrollado por mí (A.dll) que en la aplicación original se llama desde un proceso externo que básicamente es solo un archivo .exe para el que no tengo el código fuente (B.exe) El propósito deA.dll es comunicarse con un archivo .jar, que también he desarrollado por mí (C.jar) Entonces, en la aplicación, los "flujos de comunicación" como se muestran a continuación

B.exe ->A.dll ->(a través de JNI) ->C.jar

Ahora, lo que quiero hacer es agregar las llamadas que van entreA.dll yC.jar como parte de mi conjunto de pruebas en el entorno de desarrollo paraC.jar. Lo que tengo hasta ahora es que he creado otro .dll (D.dll) que refleja todas las funciones enA.dll, pero con JNIEXPORT, y simplemente realiza una llamada directa a la función respectiva enA.dll. Entonces, el "flujo de comunicación" en esta situación será el siguiente:

Prueba unitaria en el marco de desarrollo C.jar -> (a través de JNI) ->D.dll ->A.dll -> (a través de JNI) ->C.jar

En este punto, una llamada de función muy simple que simplemente imprime algo enC.jar trabaja a través de toda la cadena; desde la llamada de prueba de la unidad hastaC.jar. Sin embargo, el problema surge cuando llamo a la función enA.dll que crea una nueva JVM usandoCreateJavaVM (), que produce el siguiente error:

Se produjo un error durante la inicialización de VM No se puede cargar la biblioteca nativa: no se pudo encontrar el procedimiento especificado

Básicamente, me pregunto si realmente es posible hacer esto, o es simplemente imposible llamarCreateJavaVM () cuando ya hay una JVM en ejecución en el mismo proceso? Sé que no puedes llamarCreateJavaVM () varias veces dentro del mismo proceso, pero en esta situación solo se llama una vez, pero ya existe una JVM en el proceso. ¿Puede incluso tener varias JVM ejecutándose en el mismo proceso?

SOLUCIÓN:

Gracias a la respuesta de @ apangin, el fragmento de código a continuación resolvió mi problema:

jsize nVMs = 0; 
JavaVM** buffer;

jni_GetCreatedJavaVMs = (GetCreatedJavaVMs) GetProcAddress(GetModuleHandle(
  TEXT("jvm.dll")), "JNI_GetCreatedJavaVMs");

if (jni_GetCreatedJavaVMs == NULL) {
  // stuff
  CreateJavaVM(&jvm, (void **) &env, &args);
} else {
  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
  buffer[0]->GetEnv((void **) &env, jni_version); // 3. get environment
  jvm = buffer[0];
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta