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 函数是否有可能返回整数或布尔值?如果是,我该怎么做?
是的,直接返回值即可。
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 原始类型和原生类型之间有映射关系,参考这里。
为什么不直接做一些静态转换:
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());
我认为你的方法签名可能是错误的......
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;
}
在 Java 类中,将返回类型更改为原始 - 布尔值。在 jni 标头中,将返回类型 - jobject 更改为 jboolean,并且不要再次生成标头来保存更改。