tipos referenciados programacion primitivos objeto ejemplos definicion datos jni android-ndk

jni - referenciados - tipos de datos primitivos en programacion



Convertir tipos JNI a tipos nativos (6)

Si bien hay documentación sobre jstring convertir un jstring en una cadena nativa ( string nativeString = env->GetStringUTFChars(jStringVariable, NULL); ) No puedo encontrar un ejemplo que convierta un jboolean en un bool o un jint en un int .

¿Alguien puede sugerir cómo se logra esto?


El extraño es jchar . Se define como unsigned short y, según la configuración de su compilación, puede o no ser equivalente a wchar_t . Dependiendo de su plataforma subyacente, es mejor que trabaje con cadenas UTF8. Al menos, son equivalentes a nivel de bit a ASCII para el subconjunto de caracteres ASCII.

En Windows y Mac OS / Cocoa, sin embargo, la representación de cadena amplia nativa es exactamente unsigned short . Las cuerdas de Java encajan naturalmente en eso.


Mismo problema – arreglado. En mi caso, estoy usando openFrameworks, así que no sé si esto se aplica a proyectos que no son openFrameworks (no se han probado). Sin embargo, parece que los dos primeros argumentos en una función externa son siempre "env" y "thiz" y estos deben definirse explícitamente para cada nueva función externa.

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


Para lanzar un jboolean (que solo puede contener los valores JNI_FALSE o JNI_TRUE ) a un bool nativo, usaría algo como esto:

(bool)(jboolean == JNI_TRUE)

Si quizás el jboolean no proviene de la JVM, entonces la prueba de jboolean != JNI_FALSE podría considerarse más segura.


Si solo quieres usarlo en la sentencia if (..), esto funciona para mí sin conversión:

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


Solo necesitas lanzar jint to int usando modelos de estilo C. Lo mismo para jboolean a bool (si está utilizando el tipo bool C99) o para uint8_t (si está usando los tipos std int) o para los caracteres unsigned char .

Abra $NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h y verá que jint , jboolean , etc. son simplemente typedef s.