在JNI中,尝试通过CallObjectMethod传递布尔参数失败

时间:2017-12-19 05:17:10

标签: c++ java-native-interface

我对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崩溃了。基于此,我假设我没有正确传递一个布尔对象。

任何指导意见

2 个答案:

答案 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");