Java JNI“;“jobject thiz”;与jboolean参数的关系
我有一个Java JNI“;“jobject thiz”;与jboolean参数的关系,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我有一个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)->
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
中是有效的总是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)
根据,jobject thiz
引用类型为(NativeConnector)的对象,jclass
用于静态方法
所以问题是,在这种情况下,jobject
、jclass
和jboolean
之间的关系是什么?如果我不使用jobject
,为什么jboolean
参数总是真的
问题是JNI中的是有效的总是正确的
问题是您的JNI方法签名不正确
如果我不使用jobject
,为什么jboolean
参数总是真的
因为不使用jobject
参数是错误的。您正在jboolean
参数中接收jobject
参数。签名的正确方法
class NativeConnector {
public static native getKey(boolean isValid);
}
是
应该扔掉用于派生签名的任何进程Java\u com\u mg\u helper\u NativeConnector\u getKey(JNIEnv*env,jboolean是有效的)
。使用javah
生成方法签名。这从来没有错
问题是JNI中的是有效的总是正确的
问题是您的JNI方法签名不正确
如果我不使用jobject
,为什么jboolean
参数总是真的
因为不使用jobject
参数是错误的。您正在jboolean
参数中接收jobject
参数。签名的正确方法
class NativeConnector {
public static native getKey(boolean isValid);
}
是
应该扔掉用于派生签名的任何进程Java\u com\u mg\u helper\u NativeConnector\u getKey(JNIEnv*env,jboolean是有效的)
。使用javah
生成方法签名。这从来没有错 @user207421答案中的输入错误
对于静态方法,
公共静态本机getKey(boolean-isValid)
JNIEXPORT jstring JNICALL
Java_com_mg_helper_NativeConnector_getKey(JNIEnv*env、jclass cls、jboolean是有效的)
也许早期javah在第二个参数中使用jobject,只是
jdk8 javah在@user207421-answer中使用jclass输入错误
对于静态方法,
公共静态本机getKey(boolean-isValid)
JNIEXPORT jstring JNICALL
Java_com_mg_helper_NativeConnector_getKey(JNIEnv*env、jclass cls、jboolean是有效的)
也许早期javah在第二个参数中使用jobject,只是
jdk8 javah use jclass投票否决有什么评论吗?我不能代表任何人发言,但我发现你甚至尝试了你尝试过的东西,这让我感到惊讶。@EJP这只是因为我不知道我问题的根本原因。这就是我来这里投票反对的原因?我不能代表任何人发言,但我发现你甚至尝试了你尝试过的东西,这让我感到惊讶。@EJP这只是因为我不知道我问题的根本原因。这就是我来这里的原因,我可以看到OP认为thiz是不需要的,因为它是一个静态方法,以静态方式调用;用课堂教学法。显然,Java仍然设法从帽子中拉出一个“thiz”对象;用课堂教学法。显然,Java仍然能够从帽子中拉出一个“thiz”对象。