这是一个由两部分组成的问题。我的第一个问题与 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 端我应该提供 jdouble
或double
函数的值?
最佳答案
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/