请教能否在dll中先调用java的jvm.dll,然后再用里面的函数创建jvm么?
如题:
环境是 中文32位的xp,vs2010,java1.6.
我用vs2010编写了一个mfc扩展dll。然后dll里面做了以上操作
代码:
//查找JNI_CreateJavaVM过程。
JNICREATEPROC jvmCreateProc = (JNICREATEPROC)GetProcAddress(m_jvmDll, "JNI_CreateJavaVM");
if (jvmCreateProc == NULL)
{
FreeLibrary(m_jvmDll);
printf("查找JNI_CreateJavaVM过程错误。%l", ::GetLastError());
return false;
}
//创建JVM:
int res = (jvmCreateProc)(m_jvm, (void **)m_env, &vm_args);
一路都正常,但是到了int res = (jvmCreateProc)(m_jvm, (void **)m_env, &vm_args);
程序就卡住了,没有任何动静。也不往下走了。一直卡住。
请问是什么问题。首先,我这种在dll里再调用java的dll,再创建jvm的方式,行不行的通?
[解决办法]
void
CJavaVM::getJREPath()
{
CRegistry reg;
WCHAR subKey[512] = {0};
WCHAR buffer[256] = {0};
memset(m_szJVMPath, 0, MAX_PATH*sizeof(TCHAR));
lstrcat(subKey, L"SOFTWARE\\JavaSoft\\Java Runtime Environment");
HRESULT hr = reg.GetRegEntry(HKEY_LOCAL_MACHINE, subKey, L"CurrentVersion", buffer, 255);
if (SUCCEEDED(hr)) {
lstrcat(subKey, L"\");
lstrcat(subKey, buffer);
hr = reg.GetRegEntry(HKEY_LOCAL_MACHINE, subKey, L"JavaHome", m_szJavaHome, MAX_PATH);
hr = reg.GetRegEntry(HKEY_LOCAL_MACHINE, subKey, L"RuntimeLib", m_szJVMPath, MAX_PATH);
}
}
typedef jint (JNICALL *JNI_CreateJavaVM)(JavaVM **pvm, void **penv, void *args);
JNI_CreateJavaVM create_java_vm;
if (m_pJavaVM != 0) {
/* Only support one JVM per process */
return 0;
}
getJREPath();
m_hDll = ::LoadLibrary(m_szJVMPath);
if (m_hDll == NULL) {
Debug::OutputDebugStringFmt(_T("加载 %s 失败."), m_szJVMPath);
return -1;
}
create_java_vm = (JNI_CreateJavaVM)::GetProcAddress(m_hDll, "JNI_CreateJavaVM");
if (create_java_vm == NULL) {
Debug::OutputDebugStringFmt(_T("在 %s 内找不到 JNI_CreateJavaVM."), m_szJVMPath);
return -3;
}
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = nOptions;
vm_args.ignoreUnrecognized = JNI_TRUE;
int res = 0;
res = create_java_vm(&m_pJavaVM, (void **)&m_pJNIEnv, &vm_args);
if (res < 0) {
Debug::OutputDebugStringFmt(_T("创建 Java VM 失败, error code: %d"), res);
} else {
jint version = m_pJNIEnv->GetVersion();
Debug::OutputDebugStringFmt(_T("Java VM %d.%d 创建成功"), HIWORD(version), LOWORD(version));
}