es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    jobject bitmapObj = /* Tu código de creación de objeto Bitmap */
    
    jclass cls = env->GetObjectClass(clazz);
    jmethodID methodid = env->GetMethodID(cls, "RegisterCallback", "(Landroid/graphics/Bitmap;)V");
    env->CallVoidMethod(clazz, methodid, bitmapObj);
    

    Y en tu código Kotlin, puedes modificar el método RegisterCallback para aceptar un parámetro Bitmap también:

    fun RegisterCallback(bitmap: Bitmap) {
        /* Haz algo con el objeto Bitmap */
    }
    

    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.

Comments are closed.