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

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

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

  • 开发环境为win10 x64,jdk版本为1.8

  • Visual studio 2017 Community Edition 编写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

最佳答案

类路径

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

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.

看到这个很好的答案: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 放入应用程序的子文件夹中,并使用相对路径引用它。

演示

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

Demo

关于java - JNI_CreateJavaVM函数方法不起作用,无法调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56701911/

相关文章:

c++ - 使用 wmemset 初始化 wchar_t 数组。编码重要吗?

c++ - CRTP vs. 基类 vector

Java NetBeans - 将我的 .DLL 存储在 PATH 中 - 它在哪里?

java - JNI 和取消 AsyncTask

java - 下面的比赛在 Espresso

java - 计算最小值和最大值并四舍五入到近值

c++ - SWIG - 命名空间问题

android - 手动调用 android_main(struct android_app* state)?

java - JAXB 解码子属性而不创建子类

java - 在 Google Sheet 内运行 Java 应用程序