【发布时间】:2019-06-21 10:46:06
【问题描述】:
JNI_CreateJavaVM 函数方法不起作用,无法调试。
开发环境为win10 x64,jdk版本为1.8
Visual Studio 2017 社区版编写 C++ 项目
我正在学习 JNI。我正在尝试运行The Invocation API。以下网址为官网文档示例。
点击here!
我构建了项目并添加了一个包含 jvm.lib 的项目依赖项。我将 jvm.dll 放在项目目录中。我成功运行了这个程序。
Main.test() 是打印hello world 的方法。但是程序在执行JNI_CreateJavaVM时退出,控制台显示返回值为1。
我无法调试,我不知道发生了什么。
#include <jni.h>
int main() {
printf("begin..........\n");
JavaVM *jvm; /* denotes a Java VM */
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1];
char optionString[] = "-Djava.class.path =D:/Program Files/Java/jdk1.8.0_191/lib/";
options[0].optionString = optionString;
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface
* pointer in env */
int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
printf("result=%d", res);
delete options;
/* invoke the Main.test method using the JNI */
jclass cls = env->FindClass("Main");
jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");
env->CallStaticVoidMethod(cls, mid, 100);
/* We are done. */
jvm->DestroyJavaVM();
return 0;
}
我希望这个jvm可以被调用,但是当程序执行到`int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 我哪里错了?为什么它不起作用?
退出截图 enter image description here
jvm.dll 位置 enter image description here
jvm.lib 链接器附加库目录 enter image description here
jvm.lib 链接器附加依赖项 enter image description here
【问题讨论】:
-
“不起作用”是什么意思?它整天坐在卧室里拒绝找工作?
-
您是如何确定它在 JNI_CreateJavaVM 语句而不是
CallStaticVoidMethod调用时崩溃的?您不能相信printf,因为它不会在没有换行符的情况下将其缓冲区刷新到您的控制台。 -
我在debug模式下运行项目,逐步调试程序,但是当程序执行到JNI_CreateJavaVM方法时,整个进程crash退出,后面的语句也没有执行。跨度>
标签: java c++ java-native-interface jnienv