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?
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:objdump
u otra herramienta similar.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ónhello_name
toma un argumento de tipoString
. Asegúrese de que las firmas de las funciones de Rust coincidan con las firmas JNI esperadas.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.