Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

571
Views
¿Cómo ejecutar la función Kotlin WebAssembly desde JavaScript?

Mi objetivo es escribir una biblioteca de Kotlin, compilarla en WebAssembly y llamar a sus funciones desde JS. Desde hace unas horas trato de hacer funcionar un hola mundo simple. La documentación sobre este tema es inexistente o está bien escondida.

Este es mi archivo kotlin:

 @Used public fun hello() { println("Hello world!") } fun main(args: Array<String>) { println("main() function executed!") }

Cuando lo compilo en WebAssembly, obtengo un archivo hello.wasm y hello.wasm.js .

Primero traté de usar algo como esto para ejecutar la función:

 WebAssembly.instantiateStreaming(fetch('hello.wasm'), importObject) .then(obj => obj.instance.exports.hello());

Luego entendí que necesito pasar las importaciones desde mi archivo hello.wasm.js en el parámetro importObject . Así que supongo que necesito usar el archivo hello.wasm.js para inicializar correctamente mi programa wasm.

Cuando cargo mi wasm de la siguiente manera, no obtengo ningún error y se ejecuta la función main() .

 <script wasm="hello.wasm" src="hello.wasm.js"></script>

Pero, ¿cómo puedo ejecutar la función hello() desde JavaScript? Los únicos ejemplos de kotlin wasm que encontré no están llamando a funciones específicas sino representando algo desde la función main() .

También se agradecen mucho los enlaces a la documentación pertinente.


ACTUALIZACIÓN: logré ejecutar la función, pero no creo que esta sea la forma correcta:

 <script wasm="hello.wasm" src="hello.wasm.js"></script> <script> WebAssembly.instantiateStreaming(fetch('hello.wasm'), konan_dependencies) .then(obj => obj.instance.exports['kfun:hello$$ValueType']()); </script>

El problema es que mi archivo wasm se recupera dos veces si lo hago así.

Al cargar solo el archivo hello.wasm.js sin el atributo wasm, aparece el siguiente error:

 Uncaught Error: Could not find the wasm attribute pointing to the WebAssembly binary. at Object.konan.moduleEntry (stats.wasm.js:433) at stats.wasm.js:532
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Recientemente investigué un poco sobre esto y, según tengo entendido, su caso de uso no es realmente compatible hasta ahora. Lo que está buscando es esencialmente una biblioteca, sin embargo, si observa la documentación de Kotlin/Native, dice:

Se admiten los siguientes tipos binarios (tenga en cuenta que no todos los tipos están disponibles para todas las plataformas nativas):

[...]

sharedLib - una biblioteca nativa compartida - todos los objetivos nativos excepto wasm32

staticLib - una biblioteca nativa estática - todos los objetivos nativos excepto wasm32

Según tengo entendido, la dificultad radica en el paso de datos entre Javascript y WebAssembly, ya que solo admite ints o de forma indirecta a través de la memoria lineal.

over 4 years ago · Santiago Trujillo Report

0

Actualmente disfruto trabajar en un proyecto WASM de Kotlin y (agradable para el investigador que hay en mí) no hay experiencia en nuestro equipo. Lo siento, todavía tengo el mismo signo de interrogación en mi cabeza, pero llegué bastante lejos.

En mi caso, encontré muchos ejemplos para wasm, pero sentí que no podía usarlos, porque en Kotlin las cosas eran diferentes... En realidad, este no es el caso y las cosas simplemente están ocultas en los procesos de compilación, que en nuestro caso es tanto una bendición como una maldición. No hay docu, ¡pero kotlin hace cosas por nosotros!

Para mí, la mejor estrategia para llenar ese vacío de información es tener una mirada más profunda en el archivo *wasm.js generado. Puede parecer aterrador y es JavaScript, pero en realidad es bastante fácil tener una idea de lo que Kotlin es realmente capaz de hacer por ti. Lo mejor: si echó un vistazo a las referencias de Api ( https://developer.mozilla.org/en-US/docs/WebAssembly ) o simplemente vio un tutorial pero no pudo aplicar lo que ha visto, lo más probable es que ¡Encontrará estos fragmentos de código aquí!

Quien lea esto y quiera probar cosas: debe preparar una configuración de compilación que le permita agregar cosas al archivo *.wasm.js generado. Las partes importantes para esto en mi configuración:

 val jsinterface by tasks.creating(Exec::class) { val kotlincExecutable = "${project.properties["konanHome"]}/bin/kotlinc" inputs.property("kotlincExecutable", kotlincExecutable) outputs.file(jsInterfaceKlibFileName) val ktFile = file(workingDir).resolve("src/wasm32Main/kotlin/js_interface/imported_js_funcs.kt") val jsStubFile = file(workingDir).resolve("src/wasm32Main/js/stub.js") executable(kotlincExecutable) args( "-include-binary", jsStubFile, "-produce", "library", "-o", jsInterfaceKlibFileName, "-target", "wasm32", ktFile ) } val jsinterop by tasks.creating(Exec::class) { dependsOn(jsinterface) //inserts customized js functions on xxx.wasm.js //jsinterop -pkg kotlinx.interop.wasm.dom -o build/klib/kotlinx.interop.wasm.dom-jsinterop.klib -target wasm32 workingDir("./") executable("${project.properties["konanHome"]}/bin/jsinterop") args("-pkg", "kotlinx.interop.wasm.dom", "-o", jsinteropKlibFileName.toString(), "-target", "wasm32") } // generate jsinterop before native compile tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile::class).all { dependsOn(jsinterop) }

¿Cuánto interés hay en ese tema?

over 4 years ago · Santiago Trujillo Report

0

Por lo que sé, deberá exportar la función a una variable para seguir usándola, o permanecer en la instancia de transmisión.

Así que creo que debería ser algo como esto:

 let helloFunc; WebAssembly.instantiateStreaming(fetch('hello.wasm'), importObject) .then(({instance}) => { helloFunc = instance.exports.hello; });

después de eso, puede usar su variable como una función y llamarla así:

 helloFunc();

De lo contrario, si no necesita exportar la función para su uso posterior, puede usarla dentro de la instancia de esta manera:

 WebAssembly.instantiateStreaming(fetch('hello.wasm'), importObject) .then(({instance}) => { instance.exports.hello(); });

Si no quiere usar la deconstrucción de objetos como yo usé, puede seguir usando su sintaxis normal con obj.instance.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!