首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问能否在dll中先调用java的jvm.dll,然后再用里面的函数创建jvm么

2013-06-26 
请教能否在dll中先调用java的jvm.dll,然后再用里面的函数创建jvm么?如题:环境是 中文32位的xp,vs2010,java

请教能否在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

热点排行