java - JNI "jobject thiz"与jboolean参数关系

标签 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");
      }
   }

问题是 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 answerjobject thiz引用类型为(NativeConnector)的对象,jclass用于静态方法

那么问题是,在这种情况下,jobjectjclassjboolean 之间的关系是什么?如果我不使用 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 use 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 生成方法签名。它永远不会错。

关于java - JNI "jobject thiz"与jboolean参数关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47171929/

相关文章:

android - Gradle 构建失败,找不到 keystore.properties

android - NDK r9c - 不支持 std::future

关于单击时更改按钮的 Java ActionListener

java - 识别Servlet中的每个请求线程

android - firebase API 中的 MismatchSenderID 错误

android - 查询 ContactsContract 以同时获取电子邮件、电话和地址的最佳方法是什么?

Android NDK 找不到-lGLESv

java - Android L 5.0 和 libusb 1.0.9 - 没有权限?

java - java将所有数组元素重新初始化为零

Java android room 对象来映射