Подтвердить что ты не робот

Преобразование типов JNI в родные типы

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

Может ли кто-нибудь предложить, как это достигается?

4b9b3361

Ответ 1

Вам просто нужно отбросить 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 s.

Ответ 2

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

(bool)(jboolean == JNI_TRUE)

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

Ответ 3

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


}

Ответ 5

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

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

Ответ 6

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

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