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.

No se puede utilizar una biblioteca generada por Rust a través de un archivo .dll con Kotlin a través de JNI.

Estoy escribiendo una biblioteca simple de Rust para acceder desde Kotlin a través de JNI (Java Native Interface), pero no funciona del todo bien.

He especificado los siguientes objetivos para mi biblioteca Rust:

[lib]
crate-type = ["rlib", "cdylib"]

y aquí está el código Rust real, es bastante simple:

#[no_mangle]
pub extern "C" fn hello_world() {
    println!("¡Hola mundo!");
}

#[no_mangle]
pub extern "C" fn hello_name(name: String) {
    println!("¡Hola {}!", &name);
}

En mi código Kotlin:

fun main() {
    Lib.hello_world()
    Lib.hello_name("Jake")
}

class Lib {
    companion object {
        external fun hello_world()
        external fun hello_name(name: String)

        init {
            System.loadLibrary("hello")
        }
    }
}

Cuando ejecuto el programa Kotlin, obtengo el siguiente error:

Exception in thread "main" java.lang.UnsatisfiedLinkError: 'void Lib$Companion.hello_world()'
    at Lib$Companion.hello_world(Native Method)
    at MainKt.main(Main.kt:2)
    at MainKt.main(Main.kt)

¿Hay alguna manera de solucionar esto? ¿Debería considerar aprender/usar la biblioteca libc o el problema está relacionado con otra cosa?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el código de Kotlin no puede encontrar la función hello_world en la biblioteca de Rust. Esto podría deberse a varias razones:

    1. La biblioteca de Rust no se compiló correctamente. Asegúrese de haber compilado su biblioteca con las banderas correctas para la plataforma objetivo (en este caso, apuntando a la JVM). También puede revisar que la biblioteca se compiló exitosamente inspeccionando el binario compilado con objdump u otra herramienta similar.
    2. La firma de la función en Rust no es compatible con la firma esperada en el código de Kotlin. En este caso, parece que la función hello_world no toma argumentos, pero la función hello_name toma un argumento de tipo String. Asegúrese de que las firmas de las funciones de Rust coincidan con las firmas JNI esperadas.

    3. La forma en que se carga la biblioteca de Rust en el código de Kotlin es incorrecta. Asegúrese de que la biblioteca se esté cargando correctamente usando System.loadLibrary.

    En cuanto al uso de la biblioteca libc, podría ser útil si necesita interactuar con bibliotecas de sistema de nivel más bajo. Sin embargo, para una biblioteca simple de Rust accedida mediante JNI, es probable que no haga una gran diferencia.

Comments are closed.