#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.