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) 添加 JNIEXPORT
和 JNICALL
方法..
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_t
,jboolean
被定义为 uint8_t
。 true
和 false
的内部表示在 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。
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) 添加 JNIEXPORT
和 JNICALL
方法..
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_t
,jboolean
被定义为 uint8_t
。 true
和 false
的内部表示在 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。