我有一个像这样的JNI
代码:
class NativeConnector {
public static native getKey(boolean isValid);
}
JNIEXPORT jstring JNICALL
Java_com_mg_helper_NativeConnector_getKey(JNIEnv *env, jboolean is_valid) {
if (is_valid) {
return (*env)->NewStringUTF(env, "48759d35c");
} else {
return (*env)->NewStringUTF(env, "527c4f704");
}
}
问题是 JNI
中的 is_valid
始终为 true
并且结果始终为 "48759d35c"
,尽管我在方法 getKey
false
NativeConnector.getKey(false) // result is "48759d35c"
如果我用jobject
更改JNI
方法,它可以很好地工作:
JNIEXPORT jstring JNICALL
Java_com_mg_helper_NativeConnector_getKey(JNIEnv *env, jobject thiz , jboolean is_valid)
根据this answer ,jobject thiz
引用类型为(NativeConnector)的对象,jclass
用于静态方法
那么问题是,在这种情况下,jobject
、jclass
和 jboolean
之间的关系是什么?如果我不使用 jobject
,为什么 jboolean
参数始终为 true?
最佳答案
The problem is that
is_valid
in JNI is always true
问题是您的 JNI 方法签名不正确。
why is
jboolean
parameter always true if I don't usejobject
?
因为不使用jobject
参数是错误的。您正在将 jobject
参数接收到 jboolean
参数中。
class NativeConnector {
public static native getKey(boolean isValid);
}
是
JNIEXPORT jstring JNICALL
Java_com_mg_helper_NativeConnector_getKey(JNIEnv *env, jobject *thiz, jboolean is_valid);
无论您使用什么过程来派生签名 Java_com_mg_helper_NativeConnector_getKey(JNIEnv *env, jboolean is_valid)
都应该被丢弃。使用 javah 生成方法签名。它永远不会错。
关于java - JNI "jobject thiz"与jboolean参数关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47171929/