JNI" jobject thiz"和jboolean参数的关系

时间:2017-11-08 05:02:09

标签: 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)->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 answerjobject thiz引用类型的对象(NativeConnector),jclass用于静态方法

问题是,在这种情况下,jobjectjclassjboolean之间的关系是什么?如果我不使用jboolean,为什么jobject参数始终为真?

2 个答案:

答案 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

相关问题