JNI_CreateJavaVM函数方法不起作用,无法调试

时间:2019-06-21 10:46:06

标签: java c++ java-native-interface jnienv

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

1 个答案:

答案 0 :(得分:2)

类路径

键和等号之间有一个空格。该空间必须删除。

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(或异常0xC0000005)也是在JVM启动时有意生成的,以验证某些CPU / OS功能。

请参见以下最佳答案:https://stackoverflow.com/a/36258856

在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。在Visual Studio的“配置属性/调试/环境”下,添加PATH =%PATH%; \ bin \ server

对于以后的部署,您可以考虑将整个JRE放入应用程序的子文件夹中,并使用相对路径进行引用。

演示

最后是一个简短的演示(在printf("result=%d\n", res);的\ n处添加了单独的一行):

Demo