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

问题描述 投票:0回答:4

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

java android c java-native-interface
4个回答
10
投票

是的,直接返回值即可。

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 原始类型和原生类型之间有映射关系,参考这里


1
投票

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

return static_cast<jboolean>(bb);

return static_cast<jint>(rr);

在我的

jni.h
副本中,
jint
被定义为
int32_t
jboolean
被定义为
uint8_t
。 AFAIK 中
true
false
的内部表示在 C++ 和 Java(在 VM 级别)中是相同的(即 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());

0
投票

我认为你的方法签名可能是错误的......

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

如果您注意到一些事情:

1) 在方法周围添加

JNIEXPORT
JNICALL
.. 2) 要返回的参数类型为
j<object>

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

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

0
投票

在 Java 类中,将返回类型更改为原始 - 布尔值。在 jni 标头中,将返回类型 - jobject 更改为 jboolean,并且不要再次生成标头来保存更改。

© www.soinside.com 2019 - 2024. All rights reserved.