Java 什么';在我的情况下,当使用JNI调用CallVoidMethod时,NPE被抛出的可能原因是什么
情景: 我已经用Cpp构建了一个DLL,它被一个使用JNI的java应用程序使用。DLL也将在Java中调用方法。然而,当我调用CallVoidMethod时,java控制台中将打印一个java.lang.NullPointerException 代码如下所示: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=
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();
}