我对Java和JNI比较陌生。我有一个Java实例方法 void setState(布尔完成),我试图使用JNI从C ++调用它
tbuff = env->GetObjectClass(buff);
jmethodID setStatemid = env->GetMethodID(tbuff, "setState", "
(Ljava/lang/Boolean;)V");
if(setStatemid==0){
return JNI_FALSE;
}
// Set the buffer to busy
env->CallObjectMethod(buff, setStatemid, true);
对CallObjectMethod()的调用崩溃。我也试过传递JNI_TRUE或JNI_FALSE。看来如果我传递false或JNI_FALSE我将它传递给方法但传递的值为null。如果我通过了真的JVM崩溃了。基于此,我假设我没有正确传递一个布尔对象。
任何指导意见
答案 0 :(得分:3)
基于此,我假设我没有正确传递布尔对象。
你根本没有传递Boolean
。您传递的是整数或C ++ bool
或其值为true
的任何值。
您需要传递一个Java Boolean
,而不是true
:具体而言,Boolean.TRUE
,您必须首先通过JNI进行访问。
更好的是,重新设计setState()
方法以boolean
并传递JNI_TRUE
。
并且,由于该方法具有void返回类型,因此您应该调用CallVoidMethod(),
而不是CallObjectMethod()
。
答案 1 :(得分:1)
我知道这是一个老问题,但我发现它还没有正确答案。
您必须使用与" Z"映射的基本类型布尔值。 (见https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html)
所以你的代码应该是这样的:
jmethodID setStatemid = env->GetMethodID(tbuff, "setState", "(Z)V");