Преобразование типов JNI в родные типы
Пока есть документация относительно превращения jstring
в собственную строку (string nativeString = env->GetStringUTFChars(jStringVariable, NULL);
), я не могу найти пример, который преобразует jboolean
в bool
или jint
в int
.
Может ли кто-нибудь предложить, как это достигается?
Ответы
Ответ 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 );
}
}
Ответ 4
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp9502
Это ответит на ваш вопрос.
Ответ 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;
}