Cómo pasar un objeto o delegado utilizando JNI/Kotlin callback?
Soy nuevo en el desarrollo de JNI. Lo que estoy tratando de lograr es capturar una captura de pantalla usando JNI. Puedo lograr lo mismo usando Kotlin/Java.
Estoy utilizando el siguiente código para capturar la captura de pantalla y copiarla en un mapa de bits.
jclass bitmapConfig = env->FindClass("android/graphics/Bitmap$Config");
jfieldID rgba8888FieldID = env->GetStaticFieldID(bitmapConfig, "ARGB_8888", "Landroid/graphics/Bitmap$Config;");
jobject rgba8888Obj = env->GetStaticObjectField(bitmapConfig, rgba8888FieldID);
jclass bitmapClass = env->FindClass("android/graphics/Bitmap");
jmethodID createBitmapMethodID = env->GetStaticMethodID(bitmapClass,"createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
jobject bitmapObj = env->CallStaticObjectMethod(bitmapClass, createBitmapMethodID, SNAPSHOT_WIDTH, SNAPSHOT_HEIGHT, rgba8888Obj);
jintArray pixels = env->NewIntArray(SNAPSHOT_WIDTH * SNAPSHOT_HEIGHT);
jmethodID setPixelsMid = env->GetMethodID(bitmapClass, "setPixels", "([IIIIIII)V");
env->CallVoidMethod(bitmapObj, setPixelsMid, pixels, 0, SNAPSHOT_WIDTH, 0, 0, SNAPSHOT_WIDTH, SNAPSHOT_HEIGHT);
A continuación, necesito actualizar mi clase Kotlin para indicar que se ha creado este mapa de bits y pasar este objeto mapa de bits como una devolución de llamada. Puedo pasar una cadena utilizando la implementación de devolución de llamada Kotlin/JNI.
Mi código para la devolución de llamada Kotlin/JNI ( String )
jclass cls = env->GetObjectClass(clazz);
jmethodID methodid = env->GetMethodID(cls, "RegisterCallback", "(Ljava/lang/String;)V");
jstring jstr = env->NewStringUTF("Hello from C");
env->CallVoidMethod(clazz, methodid, jstr);
Función en el lado Kotlin:
fun RegisterCallback(success: String) {
onBitmapReceived?.invoke(success)
}
Ahora, me gustaría saber si es posible pasar un mapa de bits de esta manera. O incluso mejor, pasar un delegado o algo similar.
Gracias de antemano.
davy.ai
Sí, es posible pasar un objeto Bitmap utilizando JNI de manera similar a como se pasa una cadena. Necesitarías modificar tu código JNI para crear un objeto jobject del objeto Bitmap y luego pasarlo como parámetro a la implementación de callback Kotlin/JNI.
Aquí tienes un código JNI de ejemplo para crear un objeto jobject de un objeto Bitmap y pasarlo como parámetro a la callback Kotlin/JNI:
Y en tu código Kotlin, puedes modificar el método RegisterCallback para aceptar un parámetro Bitmap también:
Ten en cuenta que pasar objetos Bitmap grandes puede causar problemas de rendimiento, por lo que se recomienda utilizar un formato optimizado como JPEG o PNG para transferir imágenes entre el código nativo y Java/Kotlin.