将JNI类型转换为本机类型

时间:2011-06-10 15:44:10

标签: java-native-interface android-ndk

虽然有关于将jstring转换为原生字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);)的文档,但我找不到将jboolean转换为booljintint

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

6 个答案:

答案 0 :(得分:55)

您只需要使用C样式转换将jint转换为intjbooleanbool相同(如果您使用的是C99 bool类型)或uint8_t(如果您使用的是std int类型)或{{1} }。

打开unsigned char,您会看到$NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.hjint等只是jboolean s。

答案 1 :(得分:24)

要将jboolean(可能只包含值JNI_FALSEJNI_TRUE)投射到原生bool,我会使用以下内容:

(bool)(jboolean == JNI_TRUE)

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

答案 2 :(得分:3)

同样的问题 - 修复。在我的情况下,我正在使用openFrameworks,所以我不知道这是否适用于非openFrameworks项目(尚未测试)。但是,外部函数中的前两个参数似乎总是“env”和“thiz”,并且需要为每个新的extern函数明确定义这些参数。

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 );
}


}

答案 3 :(得分:1)

奇怪的是jchar。它被定义为unsigned short,并且根据您的编译设置,可能与wchar_t相同或不同。根据您的基础平台,您最好使用UTF8字符串。对于ASCII字符子集,至少这些是按位等效于ASCII。

在Windows和Mac OS / Cocoa上,本机宽字符串表示正好是unsigned short。 Java字符串自然适合它。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

这对我有用:

bool isValue = bool(jbooleanValue);