请教能否在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));
}
[解决办法]
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
[解决办法]
确保代码一样, 剩下的就可能是环境问题了,
我在普通 dll, mfc dll(寄宿到 cad 中的 arx)
都可以的.
看看链接 的 c库是不是多线程的,
再不成就启动一下 winsock