Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';在我的情况下,当使用JNI调用CallVoidMethod时,NPE被抛出的可能原因是什么_Java_C++_Java Native Interface - Fatal编程技术网

Java 什么';在我的情况下,当使用JNI调用CallVoidMethod时,NPE被抛出的可能原因是什么

Java 什么';在我的情况下,当使用JNI调用CallVoidMethod时,NPE被抛出的可能原因是什么,java,c++,java-native-interface,Java,C++,Java Native Interface,情景: 我已经用Cpp构建了一个DLL,它被一个使用JNI的java应用程序使用。DLL也将在Java中调用方法。然而,当我调用CallVoidMethod时,java控制台中将打印一个java.lang.NullPointerException 代码如下所示: void CaptureCallback::ACallbackMethod(){ jvm->AttachCurrentThread((void **)&env, NULL); jmethodID mid=

情景: 我已经用Cpp构建了一个DLL,它被一个使用JNI的java应用程序使用。DLL也将在Java中调用方法。然而,当我调用CallVoidMethod时,java控制台中将打印一个java.lang.NullPointerException

代码如下所示:

void CaptureCallback::ACallbackMethod(){
    jvm->AttachCurrentThread((void **)&env, NULL);
    jmethodID mid= env->GetMethodID(cls, "helloWorld", "()V");
    cout << "The jmethodID is : " << mid << endl;
    cout << "The jobject is : " << jobj << endl;
    cout << "The env is: " << env << endl;
    env->CallVoidMethod(obj, mid );
    jvm->DetachCurrentThread();
}
void CaptureCallback::ACallbackMethod(){
jvm->AttachCurrentThread((void**)和env,NULL);
jmethodID mid=env->GetMethodID(cls,“helloWorld”和“()V”);

cout与您上次询问的答案相同。
obj
为null,或者被调用方法中的某个对象在null时被取消引用,或者它调用的某个方法,等等。或者,可能是您提供了一些已删除的代码,有人出于某些可能不相关的原因故意抛出此异常

[选民注意:这些确实是唯一可能的原因。如果您不同意,请给出您选择的原因。]

遗憾的是,您的代码没有错误检查。您需要检查每个JNI调用的结果,而不仅仅是您喜欢的结果。之前的任何一个调用都可能抛出NPE。我依赖于您上面的断言,即它是
CallVoidMethod()
,但可能不是


为什么你要把一个可能是任何东西的异常变成一个
NullPointerException
,这是一个谜。你应该重新调用
可丢弃的
,不要因为抛出一个新的,可能不相关的异常而混淆自己。

我已经把当前的进展说明得更清楚了。正如我刚才添加的评论,obj是n打印时不为零。您的编辑没有说明任何此类内容。它说'jmethod'不是零。不是同一件事。谢谢。我删除了令人困惑的代码。我几个小时都找不到这个NPE的原因。我知道NPE是什么,但我不知道为什么我的代码会抛出这个NPE。我告诉过您。您似乎没有进行适当的调查。打印作业也不是零。我已经验证了传递给CallVoidMethod的每个参数,但没有一个是NULL。
CaptureCallback::CaptureCallback(JNIEnv *p_env, jobject p_jobj){
        env = p_env;
        jobj = p_jobj;
        jvm->AttachCurrentThread((void **)&env, NULL);
        jmethodID mid= env->GetMethodID(cls, "helloWorld", "()V");
        cout << "The jmethodID is : " << mid << endl;
        cout << "The jobject is : " << obj << endl;
        cout << "The env is: " << env << endl;
        env->CallVoidMethod(obj, mid );   
        jvm->DetachCurrentThread();
}