我有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");
}
}
虽然我在方法is_valid
中发送JNI
,但问题是true
中的"48759d35c"
始终为false
且结果始终为getKey
。
NativeConnector.getKey(false) // result is "48759d35c"
如果我使用JNI
更改jobject
方法,它可以正常运行:
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
之间的关系是什么?如果我不使用jboolean
,为什么jobject
参数始终为真?
答案 0 :(得分:3)
问题是JNI中的
is_valid
始终为真
问题是您的JNI方法签名不正确。
如果我不使用
jboolean
,为什么jobject
参数始终为真?
因为不使用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
生成方法签名。这绝不是错的。
答案 1 :(得分:0)
@user207421 答案中的一个错字。
对于静态方法, public static native getKey(boolean isValid);
JNIEXPORT jstring JNICALL Java_com_mg_helper_NativeConnector_getKey(JNIEnv *env, jclass cls, jboolean is_valid);
也许早期的javah在第二个参数中使用了jobject,只是 jdk8 javah 使用 jclass