JNI - 带有布尔值的C实现

时间:2015-07-30 16:47:14

标签: c java-native-interface

这是一个两部分问题。我的第一个问题涉及JNI实现的C部分中的布尔值。由于C没有布尔类型,我对如何做到这一点很困惑。我有一个看起来像这样的Java对象:

public class JNIResult {

    private boolean successful;
    private String data;

    public JNIResult(boolean successful, String data) {
        this.successful = successful;
        this.data = data;
    }
}

在C方面,我想创建一个新的JNIResult对象。我已经获得了构造函数方法ID,现在我正在调用(*env)->NewObject()。比如说,我想创建这个对象:

JNIResult(true, null);

我如何在C中这样做?我知道会是这样的:

jobject JNIResult = (*env)->NewObject(env, JNIResultClass, JNIResultConstructor, true, NULL);

但布尔的事让我感到困惑。

其次,源于这个问题,当在C中为本机Java方法提供参数时,无论它是构造函数还是其他方法,这些值的类型应该是什么?例如,如果我调用一个以double值作为参数的Java平方根函数,那么在C端应该为函数提供jdoubledouble值吗?

1 个答案:

答案 0 :(得分:0)

C通常使用整数值0表示" false"和#34;真"。这样,if语句将返回适当的值。

Using boolean values in C中对此进行了解释,链接指向所选答案。

typedef enum { false, true } bool;

当我从C调用Java函数时,我必须创建一个中间JAVA函数以进行适当的更改,然后使用中间Java函数来调用java函数。

因此,不是C直接调用JNIResult,而是调用Java 中的中间函数

boolean jbool;
typedef enum (myfalse, mytrue) mybool;

mybool cbool;
if (cbool == mytrue)
  {
    jbool = true;
  }
else
  {
    jbool = false;
  }

现在创建您的JNIResult对象(在Java中),在返回C之前进行需要进行的任何更改。当从一种语言调用另一种语言时,可以对任何其他情况使用类似的方法。

@adelphus指出JNI与我在JNI处理中显示的内容相当。

  

在JNI中,Java布尔值被映射到jboolean(这是一个   unsigned char) - 只是包含jni.h并传递JNI_TRUE或JNI_FALSE。 -   adelphus 7月30日17:39