1
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 传输 dt_socket 初始化失败,TRANSPORT_INIT(510) JDWP 退出错误 AGENT_ERROR_TRANSPORT_INIT(197):没有传输初始化 [../. ./../src/share/back/debugInit.c:741] 本机方法中的致命错误:JDWP 没有初始化传输,jvmtiError=AGENT_E RROR_TRANSPORT_INIT(197)

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

4

2 回答 2

4

JNI_CreateJavaVM是一个普通的 C 函数,因此不会抛出 C++ 异常,所以你try-catch没用。它通过状态代码进行通信。如果xJNI_OK,则调用成功。否则里面的值x就是错误代码。

于 2013-07-04T18:12:44.010 回答
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 编码。

顺便说一句——您可以直接调用 JNI_CreateJavaVM 并链接到 jvm.lib。


更新:

好的,你说原因是你的args结果是致命错误。因此,您必须说这是 JVM 中的错误,或者您args不是您想要的,因为您确实想避免致命错误。你试过“suspend=y”吗?

于 2013-07-04T23:14:03.877 回答