48 void GetJvmPath(
const char *vendor) {
54 strcpy(buf,
"SOFTWARE\\");
56 strcat(buf,
"\\Java Runtime Environment");
58 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
60 0, KEY_READ, &jreKey) != ERROR_SUCCESS) {
61 throw runtime_error(
"jre key not found");
64 if (RegQueryValueEx(jreKey, TEXT(
"CurrentVersion"),
nullptr,
65 nullptr, (LPBYTE) buf, &bufLen) != ERROR_SUCCESS) {
66 throw runtime_error(
"jre current version not found");
71 if (RegOpenKeyEx(jreKey,
73 0, KEY_READ, &curJreKey) != ERROR_SUCCESS) {
74 throw runtime_error(
"jre current version key not found");
78 if (RegQueryValueEx(curJreKey, TEXT(
"RunTimeLib"),
nullptr,
79 nullptr, (LPBYTE) buf, &bufLen) != ERROR_SUCCESS) {
80 throw runtime_error(
"run time lib not found");
87 }
catch(runtime_error &e) {
88 cerr << e.what() << endl;
90 if (curJreKey) RegCloseKey(curJreKey);
91 if (jreKey) RegCloseKey(jreKey);
95 GetJvmPath(
"JRockit");
96 if (&*jvmDllPath == 0) {
97 GetJvmPath(
"JavaSoft");
99 if (&*jvmDllPath == 0) {
100 throw runtime_error(
"No Java Runtime Environment found");
104 const char* GetJvmDll()
const {
105 if (&*jvmDllPath != 0) {
106 return jvmDllPath->GetString();
116 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
117 if (jvmInstance==0) {
119 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
122 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
123 jvmInstance = LoadLibrary( finder.GetJvmDll() );
125 if (jvmInstance==0) {
126 throw runtime_error(
"could not locate a java virtual machine");
129 FARPROC proc = GetProcAddress (jvmInstance,
"JNI_CreateJavaVM");
130 if (proc ==
nullptr) {
131 throw runtime_error(
"could not locate a usable java virtual machine");
133 jniCreateJavaVM = (jint (
__stdcall *) (JavaVM **,
void **,
void *)) proc;
135 proc = GetProcAddress (jvmInstance,
"JNI_GetCreatedJavaVMs");
136 if (proc ==
nullptr) {
137 throw runtime_error(
"could not locate a usable java virtual machine");
140 jniGetCreatedJavaVMs = (jint (
__stdcall *)(JavaVM **, jsize, jsize *)) proc;
142 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
145 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
146 if (jvmInstance==0) {
147 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
148 jvmInstance = dlopen (
"libjvm.so", RTLD_LAZY | RTLD_LOCAL);
150 if (jvmInstance==0) {
151 throw runtime_error(
"could not locate a java virtual machine");
154 jniCreateJavaVM = (jint (
__stdcall *) (JavaVM **,
void **,
void *))
155 dlsym(jvmInstance,
"JNI_CreateJavaVM");
156 if (jniCreateJavaVM == 0) {
157 throw runtime_error(
"could not locate a usable java virtual machine");
160 jniGetCreatedJavaVMs = (jint (
__stdcall *)(JavaVM **, jsize, jsize *))
161 dlsym(jvmInstance,
"JNI_GetCreatedJavaVMs");
162 if (jniGetCreatedJavaVMs == 0) {
163 throw runtime_error(
"could not locate a usable java virtual machine");
167 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
181 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
182 jvm->DestroyJavaVM();
184 dlclose(jvmInstance);
187 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
201 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
203 char *buf =
new char[10240];
204 strcpy(buf,
"-Djava.class.path=");
205 strcat(buf, classpath);
206 options[0].optionString = buf;
208 options[1].optionString = (
char*)
"-verbose:gc,class,jni";
211 options[2].optionString = (
char*)
"-Xdebug";
213 vm_args.version = JNI_VERSION_1_2;
214 vm_args.options = options;
216 vm_args.nOptions = 1;
218 vm_args.nOptions = 3;
220 vm_args.ignoreUnrecognized = JNI_FALSE;
223 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
224 int result = (*jniCreateJavaVM)(&jvm, (
void**)&env, &vm_args);
231 threadSpecificEnvs[GetThreadId()]=env;
237 JVM::JVM() : jvm(nullptr), mustDestroyVM(false), jvmInstance(0) {
238 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
241 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
243 if (alreadyCreated) {
244 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
245 jvm = alreadyCreated;
247 jvm->GetEnv((
void**)&env,JNI_VERSION_1_2);
249 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
253 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
257 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
263 JVM::JVM(
const char *cp) : jvm(nullptr), mustDestroyVM(false), jvmInstance(0) {
264 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
267 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
269 if (alreadyCreated) {
270 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
271 jvm = alreadyCreated;
273 jvm->GetEnv((
void**)&env,JNI_VERSION_1_2);
275 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
279 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
283 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
290 return (jclass)
GetEnv()->NewGlobalRef(obj);
295 return GetEnv()->NewGlobalRef(obj);
302 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
303 JavaVMAttachArgs args;
304 args.version=JNI_VERSION_1_2;
308 jvm->AttachCurrentThread((
void**)&env,&args);
309 MHDBGMSG(__FILE__,__LINE__,__PRETTY_FUNCTION__);
317 jvm->DetachCurrentThread();
324 JavaVM** vmBuf =
new JavaVM*[bufLen];
325 jint res = (*jniGetCreatedJavaVMs)(vmBuf, bufLen, &numVms);
329 cout << numVms <<
" java virtual machine(s) currently created" << endl;
330 if (numVms>0) result=vmBuf[0];