Конвертировать JNI-типы в Native-типы - PullRequest
47 голосов
/ 10 июня 2011

Хотя есть документация, касающаяся преобразования jstring в собственную строку (string nativeString = env->GetStringUTFChars(jStringVariable, NULL);), я не могу найти пример, который преобразует jboolean в bool или jint в int.

Кто-нибудь может подсказать, как это достигается?

Ответы [ 5 ]

55 голосов
/ 10 июня 2011

Вам просто нужно разыграть jint до int, используя приведения в стиле C. То же самое для jboolean до bool (если вы используете тип C99 bool) или uint8_t (если вы используете типы std int) или unsigned char.

Откройте $NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h, и вы увидите, что jint, jboolean и т. Д. Всего лишь typedef с.

24 голосов
/ 17 апреля 2012

Чтобы привести jboolean (который может содержать только значения JNI_FALSE или JNI_TRUE) к нативному bool, я бы использовал что-то вроде этого:

(bool)(jboolean == JNI_TRUE)

Если, возможно, jboolean не приходит от JVM, то проверка на jboolean != JNI_FALSE может считаться более безопасной.

3 голосов
/ 15 февраля 2014

Та же проблема - исправлена. В моем случае я использую 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 );
}


}
1 голос
/ 24 января 2013

Если вы просто хотите использовать его в операторе if (..), это работает для меня без преобразования:

if (jboolean == true) {
  return true;
} else {
  return false;
}
1 голос
/ 17 апреля 2012

Нечетным является jchar.Он определен как unsigned short и в зависимости от настроек компиляции может быть или не быть эквивалентным wchar_t.В зависимости от вашей базовой платформы, вам может быть лучше работать со строками UTF8.По крайней мере, они являются побитовым эквивалентом ASCII для подмножества символов ASCII.

Однако в Windows и Mac OS / Cocoa собственное строковое представление в точности равно unsigned short.Строки Java естественно вписываются в это.

...