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)
我想继续并记录错误。我该怎么做?
答案 0 :(得分:3)
JNI_CreateJavaVM
是一个普通的C函数,因此不会抛出C ++异常,因此try-catch
无用。它通过状态代码进行通信。如果x
为JNI_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”吗?