P
proy
I have a beautiful (that's at least what I think) piece of code that
soft-links to jvm.dll so that a JavaVM instance is created from C++.
The problem is that JNI_CreateJavaVM never returns! Would anyone have
some pointers to let me know what may be wrong in my code?
While referring to the code bellow, dEntryPoint2 is obtained
successfuly from the Dll, it is called, but stays into an infinite loop
(never comes back).
#include <jni.h>
JavaVM *CJavascript::m_JavaVM = NULL;
jclass CJavascript::m_class;
vector<CJavascript*> g_allObjects;
int gProcessCount = 0;
HMODULE CJavascript::m_java_dll = NULL;
typedef jint (JNICALL JNI_GetCreatedJavaVMs_t)(JavaVM **, jsize,
jsize*);
typedef jint (JNICALL JNI_CreateJavaVM_t)(JavaVM **pvm, void **penv,
void *args);
#define MY_CLASSPATH "js.jar:JavaScriptExecution.jar:."
bool EnsureJavaLaunched(JNIEnv *&dEnv)
{
dEnv = NULL;
if (CJavascript::m_JavaVM == NULL)
{
jint ret;
jmethodID mid;
jsize nVMs = 0;
if (CJavascript::m_java_dll == NULL)
{
HKEY openkey = NULL;
DWORD type;
DWORD size;
string fullKeyName;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\JavaSoft\\Java
Runtime Environment", 0, KEY_READ, &openkey) == ERROR_SUCCESS)
{
char buffer[1024];
size = sizeof(buffer);
if (RegQueryValueEx(openkey, "CurrentVersion", NULL, &type,
(LPBYTE)&buffer[0], &size) == ERROR_SUCCESS)
{
fullKeyName = "SOFTWARE\\JavaSoft\\Java Runtime
Environment\\";
fullKeyName += buffer;
RegCloseKey(openkey);
openkey = NULL;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
fullKeyName.c_str(), 0, KEY_READ, &openkey) == ERROR_SUCCESS)
{
size = sizeof(buffer);
if (RegQueryValueEx(openkey, "RuntimeLib", NULL,
&type, (LPBYTE)&buffer[0], &size) == ERROR_SUCCESS)
{
CJavascript::m_java_dll = LoadLibraryEx(buffer,
NULL, 0);
}
}
}
if (openkey != NULL)
{
RegCloseKey(openkey);
}
}
}
if (CJavascript::m_java_dll != NULL)
{
JNI_GetCreatedJavaVMs_t *dEntryPoint =
(JNI_GetCreatedJavaVMs_t*)GetProcAddress(CJavascript::m_java_dll,
"JNI_GetCreatedJavaVMs");
if (dEntryPoint != NULL)
{
if (!((dEntryPoint(&CJavascript::m_JavaVM, 1, &nVMs) == 0)
&& (nVMs == 1)))
{
JavaVMInitArgs vm_args;
JavaVMOption options[3];
char buffer[1024];
options[0].optionString = "-Djava.compiler=NONE";
/* disable JIT */
strcpy(buffer, "-Djava.class.path=");
strcat(buffer, MY_CLASSPATH);
options[1].optionString = buffer;
/* user classes */
options[2].optionString = "-verbose:jni";
/* print JNI-related messages */
vm_args.version = JNI_VERSION_1_4;
vm_args.options = options;
vm_args.nOptions = 3;
vm_args.ignoreUnrecognized = FALSE;
JNI_CreateJavaVM_t *dEntryPoint2 =
(JNI_CreateJavaVM_t*)GetProcAddress(CJavascript::m_java_dll,
"JNI_CreateJavaVM");
if (dEntryPoint2 != NULL)
{
ret = dEntryPoint2(&CJavascript::m_JavaVM,
(void**)&dEnv, &vm_args);
if ((ret >= 0) && (CJavascript::m_JavaVM != 0) &&
(dEnv != 0))
{
jclass clazz =
dEnv->FindClass("JavaScriptExecution");
if (clazz != NULL)
{
mid = dEnv->GetStaticMethodID(clazz, "main",
"([Ljava/lang/StringV");
if (mid != NULL)
{
dEnv->CallStaticVoidMethod(clazz, mid,
NULL);
}
}
}
}
}
}
}
}
if ((dEnv == NULL) && (CJavascript::m_JavaVM != NULL))
{
CJavascript::m_JavaVM->AttachCurrentThread((void**)&dEnv, NULL);
}
return (dEnv != NULL);
}
BOOL APIENTRY DllMain( HANDLE,
DWORD ul_reason_for_call,
LPVOID
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
{
JNIEnv *dEnv;
gProcessCount++;
// Launch java daemon
EnsureJavaLaunched(dEnv);
}
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
{
gProcessCount--;
if ((gProcessCount == 0) && (CJavascript::m_JavaVM !=
NULL))
{
CJavascript::m_JavaVM->DestroyJavaVM();
}
}
break;
}
return TRUE;
}
soft-links to jvm.dll so that a JavaVM instance is created from C++.
The problem is that JNI_CreateJavaVM never returns! Would anyone have
some pointers to let me know what may be wrong in my code?
While referring to the code bellow, dEntryPoint2 is obtained
successfuly from the Dll, it is called, but stays into an infinite loop
(never comes back).
#include <jni.h>
JavaVM *CJavascript::m_JavaVM = NULL;
jclass CJavascript::m_class;
vector<CJavascript*> g_allObjects;
int gProcessCount = 0;
HMODULE CJavascript::m_java_dll = NULL;
typedef jint (JNICALL JNI_GetCreatedJavaVMs_t)(JavaVM **, jsize,
jsize*);
typedef jint (JNICALL JNI_CreateJavaVM_t)(JavaVM **pvm, void **penv,
void *args);
#define MY_CLASSPATH "js.jar:JavaScriptExecution.jar:."
bool EnsureJavaLaunched(JNIEnv *&dEnv)
{
dEnv = NULL;
if (CJavascript::m_JavaVM == NULL)
{
jint ret;
jmethodID mid;
jsize nVMs = 0;
if (CJavascript::m_java_dll == NULL)
{
HKEY openkey = NULL;
DWORD type;
DWORD size;
string fullKeyName;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\JavaSoft\\Java
Runtime Environment", 0, KEY_READ, &openkey) == ERROR_SUCCESS)
{
char buffer[1024];
size = sizeof(buffer);
if (RegQueryValueEx(openkey, "CurrentVersion", NULL, &type,
(LPBYTE)&buffer[0], &size) == ERROR_SUCCESS)
{
fullKeyName = "SOFTWARE\\JavaSoft\\Java Runtime
Environment\\";
fullKeyName += buffer;
RegCloseKey(openkey);
openkey = NULL;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
fullKeyName.c_str(), 0, KEY_READ, &openkey) == ERROR_SUCCESS)
{
size = sizeof(buffer);
if (RegQueryValueEx(openkey, "RuntimeLib", NULL,
&type, (LPBYTE)&buffer[0], &size) == ERROR_SUCCESS)
{
CJavascript::m_java_dll = LoadLibraryEx(buffer,
NULL, 0);
}
}
}
if (openkey != NULL)
{
RegCloseKey(openkey);
}
}
}
if (CJavascript::m_java_dll != NULL)
{
JNI_GetCreatedJavaVMs_t *dEntryPoint =
(JNI_GetCreatedJavaVMs_t*)GetProcAddress(CJavascript::m_java_dll,
"JNI_GetCreatedJavaVMs");
if (dEntryPoint != NULL)
{
if (!((dEntryPoint(&CJavascript::m_JavaVM, 1, &nVMs) == 0)
&& (nVMs == 1)))
{
JavaVMInitArgs vm_args;
JavaVMOption options[3];
char buffer[1024];
options[0].optionString = "-Djava.compiler=NONE";
/* disable JIT */
strcpy(buffer, "-Djava.class.path=");
strcat(buffer, MY_CLASSPATH);
options[1].optionString = buffer;
/* user classes */
options[2].optionString = "-verbose:jni";
/* print JNI-related messages */
vm_args.version = JNI_VERSION_1_4;
vm_args.options = options;
vm_args.nOptions = 3;
vm_args.ignoreUnrecognized = FALSE;
JNI_CreateJavaVM_t *dEntryPoint2 =
(JNI_CreateJavaVM_t*)GetProcAddress(CJavascript::m_java_dll,
"JNI_CreateJavaVM");
if (dEntryPoint2 != NULL)
{
ret = dEntryPoint2(&CJavascript::m_JavaVM,
(void**)&dEnv, &vm_args);
if ((ret >= 0) && (CJavascript::m_JavaVM != 0) &&
(dEnv != 0))
{
jclass clazz =
dEnv->FindClass("JavaScriptExecution");
if (clazz != NULL)
{
mid = dEnv->GetStaticMethodID(clazz, "main",
"([Ljava/lang/StringV");
if (mid != NULL)
{
dEnv->CallStaticVoidMethod(clazz, mid,
NULL);
}
}
}
}
}
}
}
}
if ((dEnv == NULL) && (CJavascript::m_JavaVM != NULL))
{
CJavascript::m_JavaVM->AttachCurrentThread((void**)&dEnv, NULL);
}
return (dEnv != NULL);
}
BOOL APIENTRY DllMain( HANDLE,
DWORD ul_reason_for_call,
LPVOID
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
{
JNIEnv *dEnv;
gProcessCount++;
// Launch java daemon
EnsureJavaLaunched(dEnv);
}
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
{
gProcessCount--;
if ((gProcessCount == 0) && (CJavascript::m_JavaVM !=
NULL))
{
CJavascript::m_JavaVM->DestroyJavaVM();
}
}
break;
}
return TRUE;
}