这是一个两部分问题。我的第一个问题涉及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端应该为函数提供jdouble
或double
值吗?
答案 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