JNI 函数 return 整数或布尔值有可能吗?

Is it possible that JNI function return integer or boolean?

JAVA代码

boolean b = invokeNativeFunction();
int i = invokeNativeFunction2();

C代码

jboolean Java_com_any_dom_Eservice_invokeNativeFunction(JNIEnv* env, jobject obj) {
    bool bb = 0;
    ...
    return // how can return 'bb' at the end of the function?
}

jint Java_com_any_dom_Eservice_invokeNativeFunction2(JNIEnv* env, jobject obj) {
    int rr = 0;
    ...
    return // how can return 'rr' at the end of the function?
}

JNI 函数 return 整数或布尔值是否可能?如果是,我该怎么做?

我认为您的方法签名可能有误...

https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

如果您注意到以下几点:

1) 添加 JNIEXPORTJNICALL 方法.. 2) 要返回的 j<object> 类型的参数。

我认为您需要将您的 int 示例修改为:

JNIEXPORT jint JNICALL Java_com_any_dom_Eservice_invokeNativeFunction2(JNIEnv* env, jobject obj) {
    jint rr = 99;
    ...
    return rr;
}

为什么不做一些静态转换:

return static_cast<jboolean>(bb);

return static_cast<jint>(rr);

在我的 jni.h 副本中,jint 被定义为 int32_tjboolean 被定义为 uint8_ttruefalse 的内部表示在 C++ 和 Java(在 VM 级别)AFAIK 中相同(即 0==false,1==true)。

您当然可以根据需要添加一些完整性检查,例如:

assert(numeric_limits<jint>::is_signed == numeric_limits<decltype(rr)>::is_signed &&
       numeric_limits<jint>::min() <= numeric_limits<decltype(rr)>::min() &&
       numeric_limits<jint>::max() >= numeric_limits<decltype(rr)>::max());

是的,直接 return 值。

JNIEXPORT jint JNICALL Java_com_example_demojni_Sample_intMethod(JNIEnv* env, jobject obj,
    jint value) {
    return value * value;
}

JNIEXPORT jboolean JNICALL Java_com_example_demojni_Sample_booleanMethod(JNIEnv* env,
    jobject obj, jboolean unsignedChar) {
    return !unsignedChar;
}

Java原始类型和原生类型之间存在映射关系,参考here