在JNI中创建新对象

时间:2018-01-03 08:53:44

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

我一直在JNI中创建一些代码并且大部分代码工作正常但我无法从C ++创建Java对象的实例,因为我的Java IDE给了我以下错误:

  

Java Runtime Environment检测到致命错误:

     

EXCEPTION_ACCESS_VIOLATION(0xc0000005)at pc = 0x0000000070e1e0d2,pid = 10100,tid = 0x0000000000000d90

     

JRE版本:Java(TM)SE运行时环境(8.0_101-b13)(版本1.8.0_101-b13)   Java VM:Java HotSpot(TM)64位服务器VM(25.101-b13混合模式windows-amd64压缩oops)   有问题的框架:   V [jvm.dll + 0x15e0d2]

     

无法编写核心转储。默认情况下,在Windows的客户端版本

上未启用小型转储      

包含更多信息的错误报告文件保存为:   C:\ Users \ Alienware \ Documents \ Netbeans Projects \ NativeTest \ hs_err_pid10100.log

     

如果您想提交错误报告,请访问:   http://bugreport.java.com/bugreport/crash.jsp

我正在尝试创建的Java对象是:

public class ConstructorObject {    
    public ConstructorObject() {
        System.out.println("Hello World!");
    }
}

,本机类是:

public class NativeNewObject
{
    static {
        System.loadLibrary("NativeLibrary");
    }

    private native void callConstructorObject0();

    public void callConstrtuctorObject() {
        callConstructorObject0();
    }
}

C ++代码是:

JNIEXPORT void JNICALL Java_main_NativeNewObject_callConstructorObject0(JNIEnv *e, jobject obj) {
    jclass c = e->FindClass("ConstructorObject");
    jmethodID mid = e->GetMethodID(c, "<init>", "()V");
    jobject newObj = e->NewObject(c, mid);
}

感谢。

2 个答案:

答案 0 :(得分:3)

您的班级查找是否成功?您是否看到c的值包含除NULL之外的其他内容?

答案 1 :(得分:1)

不确定是否有帮助,我在构造函数获取方面遇到了问题,我遇到了这样的事情:

jmethodID mid = e->GetMethodID(c, "<init>", "()V");

我将其更改为

jmethodID mid = e->GetMethodID(c, "<init>", "void(V)");