JNI_CreateJavaVM函数方法不起作用,无法调试
JNI_CreateJavaVM function method does not work and cannot be debugged
JNI_CreateJavaVM函数方法不起作用,无法调试
开发环境为win10 x64,jdk版本为1.8
Visual studio 2017社区版写一个C++项目
我正在学习 JNI。我正在尝试 运行 The Invocation API
。以下URL为官网文档示例
点击here!
我构建了项目并添加了一个包含 jvm.lib 的项目依赖项。我把 jvm.dll 放在项目目录中。我成功运行这个程序。
Main.test()
是打印hello world
的一种方法。但是执行JNI_CreateJavaVM时程序退出,控制台显示return值为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
类路径
键和等号之间有一个space。 space 必须删除。
char optionString[] = "-Djava.class.path =D:/Program Files/Java/jdk1.8.0_191/lib/";
类路径值
java.class.path 值必须指向已编译的 .class 文件所在的基目录。
看起来你没有使用包名,那么它是 Main.class 所在的目录,所以它可能看起来应该是这样的:
char optionString[] = "-Djava.class.path=c:/Users/name/MyJavaPrograms/classes";
访问冲突
SEGV (or exception 0xC0000005) is also generated intentionally on JVM startup to verify certain CPU/OS features.
看到这个很好的答案:
在Visual Studio中,当显示异常对话框时,只需关闭它在那里中断。这将防止您下次再次启动该程序时再次看到它。
Java
为了完整起见:Java 方法应如下所示:
public class Main {
public static void test(int num) {
System.out.println("Java: test called with '" + num + "'");
}
...
Visual Studio配置
需要找到 jvm.dll。在配置 Properties/Debugging/Environment 下的 Visual Studio 中添加 PATH=%PATH%;\bin\server
对于以后的部署,您可以考虑将整个 JRE 放入应用程序的子文件夹中,并使用相对路径引用它。
演示
最后一个简单的demo(这里加了个\n printf("result=%d\n", res);
单独一行):
JNI_CreateJavaVM函数方法不起作用,无法调试
开发环境为win10 x64,jdk版本为1.8
Visual studio 2017社区版写一个C++项目
我正在学习 JNI。我正在尝试 运行 The Invocation API
。以下URL为官网文档示例
点击here!
我构建了项目并添加了一个包含 jvm.lib 的项目依赖项。我把 jvm.dll 放在项目目录中。我成功运行这个程序。
Main.test()
是打印hello world
的一种方法。但是执行JNI_CreateJavaVM时程序退出,控制台显示return值为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
类路径
键和等号之间有一个space。 space 必须删除。
char optionString[] = "-Djava.class.path =D:/Program Files/Java/jdk1.8.0_191/lib/";
类路径值
java.class.path 值必须指向已编译的 .class 文件所在的基目录。
看起来你没有使用包名,那么它是 Main.class 所在的目录,所以它可能看起来应该是这样的:
char optionString[] = "-Djava.class.path=c:/Users/name/MyJavaPrograms/classes";
访问冲突
SEGV (or exception 0xC0000005) is also generated intentionally on JVM startup to verify certain CPU/OS features.
看到这个很好的答案:
在Visual Studio中,当显示异常对话框时,只需关闭它在那里中断。这将防止您下次再次启动该程序时再次看到它。
Java
为了完整起见:Java 方法应如下所示:
public class Main {
public static void test(int num) {
System.out.println("Java: test called with '" + num + "'");
}
...
Visual Studio配置
需要找到 jvm.dll。在配置 Properties/Debugging/Environment 下的 Visual Studio 中添加 PATH=%PATH%;
对于以后的部署,您可以考虑将整个 JRE 放入应用程序的子文件夹中,并使用相对路径引用它。
演示
最后一个简单的demo(这里加了个\n printf("result=%d\n", res);
单独一行):