Как я могу вызвать асинхронную функцию rust из синхронной функции Java через JNI?

#java #asynchronous #rust #async-await

Вопрос:

В настоящее время я пытаюсь запустить асинхронную функцию внутри Java с помощью ящика Rust JNI. Мне было интересно, есть ли способ запустить асинхронную задачу foo.async с помощью функции синхронизации. Это делается для асинхронного запуска в Java. Так что в основном мне нужно fn , чтобы запустить an async fn .

 package quest.evo.runtime

import quest.evo.runtime.objects.MainWorker
import java.io.File
import java.io.FileOutputStream

object Library {
    external fun create_main_worker(): MainWorker;

    init {
        val tempDir = File(System.getProperty("java.io.tmpdir"))
        try {
            if (tempDir.exists()) {
                val os = System.getProperty("os.name")
                val extension = if (os.startsWith("Windows")) ".dll" else if (os.startsWith("Mac OS")) ".dylib" else ".so"
                if (tempDir.canWrite()) {
                    val file = File(tempDir, "libevo$extension")
                    file.delete()
                    file.createNewFile()
                    try {
                        Library::class.java.classLoader.getResourceAsStream("libevo$extension").use { inputStream ->
                            FileOutputStream(file.absolutePath).use { outputStream ->
                                val buffer = ByteArray(4096)
                                if (inputStream != null) {
                                    while (true) {
                                        val length = inputStream.read(buffer)
                                        if (length == -1) {
                                            break
                                        }
                                        outputStream.write(buffer, 0, length)
                                    }
                                }
                            }
                        }
                    } catch (ignored: Exception) {
                    }
                    System.load(file.absolutePath)
                } else {
                    println("Cannot write to the temp directory.")
                }
            } else {
                println("Cannot find the temp directory.")
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    @JvmStatic
    fun main(args: Array<String>) {
        val test = create_main_worker();
    }
}
 

Комментарии:

1. Я полагаю, вам нужно будет использовать выделенный поток — в противном случае вы рискуете заблокировать свой процесс.

2. Пожалуйста, опубликуйте свой текущий Java-код.

3. Вы не можете, потому что вам нужна асинхронная среда выполнения. По крайней мере, вам нужно Context amp; Waker , чтобы перейти к вашему асинхронному fn.

4. @Dai это в Котлине, но компилируется в JVM.

5. hastebin.com/icelamejiy.kotlin