Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI“;“jobject thiz”;与jboolean参数的关系_Java_Android_Android Ndk_Java Native Interface - Fatal编程技术网

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”对象。