2023-01-20 320
我想检索一条错误消息,该消息说明了为什么JVM无法加载.从这里提供的示例:
/jni/html/invoke.html
我提取了此示例:
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res < 0) {
// retrieve verbose error here?
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
在我的具体情况下,我在vm_args中提供无效的参数,并希望看到我在命令行中获得的内容:”未识别的选项:-foo = bar”
在进行进一步测试时,JVM似乎正在输入我要stdout或stderr的消息.我相信我需要捕获Stdout和STDERR才能获得我要寻找的错误(除非有一种简单的方法).我正在用C ++进行编码,因此,如果某人可以显示一种将错误捕获到理想的弦乐流中的方法.
谢谢,
兰迪
我能够通过使用此处描述的” VFPRINTF”选项来获得我需要的东西:
static string jniErrors;
static jint JNICALL my_vfprintf(FILE *fp, const char *format, va_list args)
{
char buf[1024];
vsnprintf(buf, sizeof(buf), format, args);
jniErrors += buf;
return 0;
}
...
JavaVMOption options[1];
options[0].optionString = "vfprintf";
options[0].extraInfo = my_vfprintf;
JavaVMInitArgs vm_args;
memset(&vm_args, 0, sizeof(vm_args));
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.version = JNI_VERSION_1_4;
vm_args.ignoreUnrecognized = JNI_FALSE;
JNIEnv env;
JavaVM jvm;
jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res != JNI_OK)
setError(jniErrors);
jniErrors.clear();
还有趣的是,我无法用任何freopen或dup2的技巧正确地捕获stdout或stderr.我可以正确加载我的 dll,并正确重定向,而不是JVM.无论如何,这样更好,因为我想要内存中的错误,而不是在文件中.
当我编写此代码时,我还将通过stdout/stderr获取错误.
在您的过程中重定向stdout/stderr的最佳方法是使用.这是一个 stackoverflow问题专门针对该主题.
但是,一旦通过该调用,您就会有一个JNIEnv,所有进一步的错误检查都可以并且应该通过调用JNIEnv::ExceptionOccurred()来完成,该JNIEnv::ExceptionOccurred()可以返回Throwable对象,然后您可以询问该对象使用您的JNI代码.
掌握了Stdout和Stderr之后,无论如何您都需要,添加-XCHECK:JNI到您的JVM命令行,从JVM中获取与JNI相关的额外警告.
以上所述是小编给大家介绍的当通过JNI加载JVM失败时,如何得到一个错误信息?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26175.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态