Комментарии 8
А в Андроиде нет Джавовских аналогов JNA или JNR? Там всё таки попроще нативный код прицеплять...
Ето оч полезная инфа
Подскажите, есть ли простой способ сделать кусок кода платформоспецифичным? Например, у меня есть код, который хорошо реализуется с помощью векторных инструкций armv8a, а для остальных платформ я могу сделать альтернативную (совместимую) реализацию на java(kotlin).
Да, сделайте нативный (native) метод для оптимизации и вызывайте его по условию, которое проверите и сохраните в статическом поле. Ключевое тут, как шарить результаты - через массив на стороне java, или нативную память. На гитхабе, наверняка есть примеры.
Если речь идёт чисто про натив на C/C++, то можно сделать это проверив соответсвующие дефинишоны препроцессора, которые назначает сама система сборки в NDK. Например:
#ifdef __aarch64__
// implementation optimized for arm64-v8a
#else
// normal implementation
#endif
Аналогичные проверки можно сделать и для других актуальных для современного андроида архитектур (armeabi-v7a, x86, x86_64).
В блоках под конкретную архитектуру можно делать ассемблерные вставки через __asm__()
, в которых можно реализовать что-то из платформенных оптимизаций. Только обязательно закрывайте всю подобную логику ifdef-ами, чтобы не нарваться на проблемы с компиляцией под другие платформы.
написанными на других языках программирования, таких как C, C++ или ассемблер.
уточнение: для любых компилируемых ЯП, а не только для этих трёх.
Для желающих изучать нативную разработку в Android, обязательно пользуйтесь документацией. Там очень много полезного. И можете смотреть не только нативную часть, потому что зачастую надо именно переплетать java-код с нативным.
Жаль, что в статье мало раскрыта эта тема и нет ссылок.
Нативные библиотеки для Android