将JNI类型转换为本机类型

Gra*_*eme 48 java-native-interface android-ndk

虽然有关于把一个文件jstring到本地字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);)我找不到这将转换为一个例子jboolean,以一个booljint一个int.

谁能建议如何实现这一目标?

Gre*_*osz 57

你只需要转换jintint使用C样式转换.同样适用jbooleanbool(如果您使用的是C99 bool类型)或uint8_t(如果您使用的是std int类型)或者unsigned char.

打开$NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h,你会看到jint,jboolean等等typedef.

  • 你的意思是int intValue =(int)jIntValue; ? (9认同)
  • 确切地说,C 风格的演员将完成这项工作 (2认同)
  • 我不知道,你问如何将 `jint` 转换为 `int`,答案是 `jint` 只是一个 `typedef` 到 `int` 或 `int32_t` 取决于平台 (2认同)

小智 24

要将一个jboolean(可能只包含值JNI_FALSE或者JNI_TRUE)转换为本机,bool我会使用这样的东西:

(bool)(jboolean == JNI_TRUE)
Run Code Online (Sandbox Code Playgroud)

如果可能jboolean不是来自JVM,那么测试jboolean != JNI_FALSE可能会被认为更安全.

  • 这有点限制.我认为(bool)(java_rtn!= JNI_FALSE)更好,因为某些库可能会返回true,因为某个整数不等于1(和JNI_TRUE == 1). (8认同)
  • @BloodShura问题是关于将_from_ Java的`jboolean`转换为native,而不是相反,所以Windows API在这里做的事情是无关紧要的. (4认同)
  • @Alnitak问题是,并非总是jboolean会直接来自JVM。您可以将布尔类型(可以来自任何其他来源,例如Windows API)转换为jboolean,然后,此jboolean可能具有比0和1多的值。然后,为了安全起见,最好检查该值是否大于零,而不是检查是否等于一。 (2认同)