c - JNI——带有 bool 值的 C 实现

标签 c java-native-interface

这是一个由两部分组成的问题。我的第一个问题与 JNI 实现的 C 部分中的 bool 值有关。由于 C 没有 bool 类型,我对如何执行此操作感到困惑。我有一个如下所示的 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);

但是 bool 值让我感到困惑。

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

最佳答案

C 通常使用整数值 0 表示“假”,使用 1 表示“真”。这样,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 处理中执行的操作与我上面显示的相同。

In JNI, Java boolean values are mapped to jboolean (which is an unsigned char) - just inlclude jni.h and pass JNI_TRUE or JNI_FALSE. – adelphus Jul 30 at 17:39

关于c - JNI——带有 bool 值的 C 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729611/

相关文章:

python - 为什么这段 C 代码通过 Python 的 ctypes 运行时的执行速度是直接运行时的一半?

java - Android NDK 中的某些 C++ 包含文件不起作用

android - 使用 JNI 时实例和类变量状态的问题

c - unsigned long long 十六进制格式打印

c - 如何让用户选择 OpenCL 设备?

c - 避免在头文件中为弱引用重新定义别名变量

c - 访问 64 位 DLL 函数时出错

java - 强制 JNI Get<type>ArrayElements 返回指针

java - 如何构建 JNI .dll?

c++ - 从有符号字符转换为无符号字符然后再转换回来?