将JNItypes转换为本机types

虽然有关于将jstring转换为本地string的文档( string nativeString = env->GetStringUTFChars(jStringVariable, NULL); )我找不到将jboolean转换为booljintint的示例。

任何人都可以build议如何实现?

你只需要使用C风格强制转换jint intjbooleanbool (如果使用C99 booltypes)或uint8_t (如果使用std inttypes)或unsigned char

打开$NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h ,你会看到jintjboolean等只是typedef s。

要将jboolean (可能只包含值JNI_FALSEJNI_TRUE )转换为本地bool我会使用类似下面的内容:

 (bool)(jboolean == JNI_TRUE) 

如果jboolean不是来自JVM,那么testingjboolean != JNI_FALSE可能会被认为是更安全的。

同样的问题已修复。 在我的情况下,我使用openFrameworks,所以我不知道这是否适用于非openFrameworks项目(尚未testing)。 然而,看起来外部函数中的前两个参数始终是“env”和“thiz”,并且需要为每个新的外部函数明确定义这些参数。

 extern "C"{ // casts the variable properly void Java_com_package_JavaClass_someFunction( JNIEnv* env, jobject thiz, jboolean yourBool ){ myTestApp->someFunction( (bool) yourBool ); } // "yourBool" will always be "1" because its taking the spot of "thiz" which is not null void Java_com_package_JavaClass_someFunction( JNIEnv* env, jboolean yourBool ){ myTestApp->someFunction( (bool) yourBool ); } // "yourBool" will always be "1" because its taking the spot of "env" which is not null void Java_com_package_JavaClass_someFunction( jboolean yourBool ){ myTestApp->someFunction( (bool) yourBool ); } } 

奇怪的是jchar 。 它被定义为unsigned short ,取决于你的编译设置,它可能与wchar_t相等或不相等。 根据您的底层平台,使用UTF8string可能会更好。 至less对于字符的ASCII子集,它们与ASCII等同。

然而,在Windows和Mac OS / Cocoa上,本地宽string表示法正好是unsigned short 。 Javastring自然适合。

如果你只是想在if(..)语句中使用它,这是为我工作,没有转换:

 if (jboolean == true) { return true; } else { return false; }