JNI函数是否可能返回整数或布尔值?

时间:2015-01-13 15:06:50

标签: java android c java-native-interface

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函数是否可能返回整数或布尔值?如果是的话,我该怎么做?

3 个答案:

答案 0 :(得分:5)

是的,只需直接返回值。

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

答案 1 :(得分:0)

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

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

如果你发现一些事情:

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

我认为你需要将你的int示例mofidy:

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

答案 2 :(得分:0)

为什么不做一些静态演员:

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());