Size: a a a

Kotlin Community

2020 August 17

PA

Pavel Aleksandrov in Kotlin Community
Ребят, был у кого-нибудь опыт работы с вызовом C++ кода через JNI из Kotlin так, что код будет вызываться асинхронно через coroutines?
источник

AN

Alexander Nozik in Kotlin Community
Pavel Aleksandrov
Ребят, был у кого-нибудь опыт работы с вызовом C++ кода через JNI из Kotlin так, что код будет вызываться асинхронно через coroutines?
В общем случае это не реально. Нормального cinterop с С++ нет (в общем случае только C API). Какая-то передача суспед функции вовне вообще не возможна, только если завернуть колбэк в корутину.
источник

PA

Pavel Aleksandrov in Kotlin Community
Нечто такое по идее невозможно?
suspend fun getObjectFromCpp(param: String): SomeObject =
   withContext(Dispatchers.IO) {
     nativeLib.getObject(param)    
   }
// call example
GlobalScope.launch(Dispatchers.Main) {
  setLoadingState()
  val receivedObject = getObjectFromCpp("test_name")
  populateUI(receivedObject)
}
источник

BP

Bogdan Panchenko in Kotlin Community
Да вроде должно работать
источник

PA

Pavel Aleksandrov in Kotlin Community
Ну то есть, мне пофиг на обработку операции в C++, пусть это будет блокирующий вызов, но на другом thread'е. Главное, убрать вызов с основного потока
источник

AN

Alexander Nozik in Kotlin Community
Pavel Aleksandrov
Нечто такое по идее невозможно?
suspend fun getObjectFromCpp(param: String): SomeObject =
   withContext(Dispatchers.IO) {
     nativeLib.getObject(param)    
   }
// call example
GlobalScope.launch(Dispatchers.Main) {
  setLoadingState()
  val receivedObject = getObjectFromCpp("test_name")
  populateUI(receivedObject)
}
Да, такое будет, но это блокирующий вызов.
источник

PA

Pavel Aleksandrov in Kotlin Community
Alexander Nozik
Да, такое будет, но это блокирующий вызов.
То бишь без всяких проблем такое должно запуститься? Но с блокировкой одного из thread'ов? Думаю, не так страшно заблокировать не Main thread, если нужно сделать что-то тяжелое из native
источник

AN

Alexander Nozik in Kotlin Community
Pavel Aleksandrov
То бишь без всяких проблем такое должно запуститься? Но с блокировкой одного из thread'ов? Думаю, не так страшно заблокировать не Main thread, если нужно сделать что-то тяжелое из native
Да, нормально. Но с С++ все равно будут проблемы если это не C API
источник

PA

Pavel Aleksandrov in Kotlin Community
Alexander Nozik
Да, нормально. Но с С++ все равно будут проблемы если это не C API
А разве нужно делать какие-то действия с C/C++ кодом? Я думал, что можно просто вызвать его на другом потоке и вернуть результат. Или нужно отдельно как-то обрабатывать это в самом C/C++?
источник

AN

Alexander Nozik in Kotlin Community
Pavel Aleksandrov
А разве нужно делать какие-то действия с C/C++ кодом? Я думал, что можно просто вызвать его на другом потоке и вернуть результат. Или нужно отдельно как-то обрабатывать это в самом C/C++?
А, стоп, это же JNI, да, конечно все можно. Я про K-N думаю
источник

PA

Pavel Aleksandrov in Kotlin Community
Alexander Nozik
А, стоп, это же JNI, да, конечно все можно. Я про K-N думаю
Спасибо!
источник

AN

Alexander Nozik in Kotlin Community
И лучше не JNI, а JNA, мороки меньше
источник

PA

Pavel Aleksandrov in Kotlin Community
Alexander Nozik
И лучше не JNI, а JNA, мороки меньше
Я привязан к Android. Там разве есть нормальный interop с этим? Думал, что NDK только с JNI дружит
источник

AN

Alexander Nozik in Kotlin Community
Pavel Aleksandrov
Я привязан к Android. Там разве есть нормальный interop с этим? Думал, что NDK только с JNI дружит
Вот не знаю, вообще JNA - это прсто прослойка над JNI, но насчет андроида не уверен
источник

PA

Pavel Aleksandrov in Kotlin Community
Alexander Nozik
Да, такое будет, но это блокирующий вызов.
Если это блокирующий вызов, то будут ли работать остальные плюшки корутин? Типо отмена Job'ы и т д?
источник

LS

Lev Shagalov in Kotlin Community
operator fun List<Item>.times(count: Int) = this + this + this + this
Это для count == 4. А как красиво сделать для любого числа?
источник

AN

Alexander Nozik in Kotlin Community
Pavel Aleksandrov
Если это блокирующий вызов, то будут ли работать остальные плюшки корутин? Типо отмена Job'ы и т д?
Отмена - нет конечно. В смысле запущенная задача в С++ доработает до конца
источник

AN

Alexander Nozik in Kotlin Community
Сама корутина-то отменится
источник

PA

Pavel Aleksandrov in Kotlin Community
Alexander Nozik
Отмена - нет конечно. В смысле запущенная задача в С++ доработает до конца
принял, спасибо
источник

AN

Alexander Nozik in Kotlin Community
Lev Shagalov
operator fun List<Item>.times(count: Int) = this + this + this + this
Это для count == 4. А как красиво сделать для любого числа?
например fun List<Item>.times(count: Int) = buildList{repeat(count){addAll(this@times)}. но я очень не рекомендую делать это оператором.
источник