如何捕获JNI_CreateJavaVM抛出的错误?

时间:2013-07-04 11:12:10

标签: java-native-interface

PtrCreateJavaVM ptrCreateJavaVM = 
    (PtrCreateJavaVM)GetProcAddress(hinstLib, "JNI_CreateJavaVM");
JNIEnv* env = NULL;
try {
    int x = ptrCreateJavaVM(&jvm, (void **)&env, &args);
}catch (int e)
{
    printf("%d", e);
    fflush(0);
}

如果缺少附加调试器,此代码只存在整个程序并将其打印到控制台:

  

错误:传输错误202:连接失败:连接被拒绝错误:   JDWP Transport dt_socket初始化失败,TRANSPORT_INIT(510)   JDWP退出错误AGENT_ERROR_TRANSPORT_INIT(197):无传输   初始化[../。 ./../src/share/back/debugInit.c:741]致命错误   native方法:JDWP没有传输初始化,jvmtiError = AGENT_E   RROR_TRANSPORT_INIT(197)

我想继续并记录错误。我该怎么做?

2 个答案:

答案 0 :(得分:3)

JNI_CreateJavaVM是一个普通的C函数,因此不会抛出C ++异常,因此try-catch无用。它通过状态代码进行通信。如果xJNI_OK,则呼叫成功。否则x中的值是错误代码。

答案 1 :(得分:0)

致命错误可能来自使用ptrCreateJavaVM的来电。要使其正常工作,hinstLib必须是jvm.dll(或等效)的有效句柄,GetProcAddress必须成功。

GetProcAddress的文档说:

  

如果函数失败,则返回值为NULL。要获得扩展错误   信息,请致电GetLastError

另请注意,处理字符串的Win32 API具有“ANSI”和Unicode版本的函数和结构。近几十年来,通常更容易在任何地方使用Unicode。 (Java和.NET做; VB做了; Windows和WWW通常都这样做。)所以,试试:

GetProcAddressW(hinstLib, L"JNI_CreateJavaVM")

其中“W”和“L”表示“宽”字符,在Win32 API和MSVC中表示Unicode的UTF-16LE编码。

BTW-您可以直接调用JNI_CreateJavaVM并链接到jvm.lib。


更新:

好的,你说原因是你的args导致致命错误。所以,你必须说这是JVM中的一个错误,或者你的args不是你想要的,因为你确实想要避免致命错误。你试过“暂停= y”吗?