我想检索一条错误消息来解释 jvm 加载失败的原因。从此处提供的示例来看:
http://java.sun.com/docs/books/jni/html/invoke.html http://java.sun.com/docs/books/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”选项来获得我需要的内容:
https://web.archive.org/web/20111229234347/http://java.sun.com/products/jdk/faq/jnifaq-old.html https://web.archive.org/web/20111229234347/http://java.sun.com/products/jdk/faq/jnifaq-old.html
虽然我使用的是jdk1.2选项。此代码片段总结了我的解决方案:
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 。我可以加载我的owndll 并正确重定向,但 jvm 不正确。不管怎样,这种方式更好,因为我想要内存中的错误而不是文件中的错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)