Pull to refresh

Comments 8

А в Андроиде нет Джавовских аналогов JNA или JNR? Там всё таки попроще нативный код прицеплять...

Это медленнее и плодит мусор со стороны JVM, под капотом тот же JNI, на x86 (Galaxy Tab) вероятно заведется.

Подскажите, есть ли простой способ сделать кусок кода платформоспецифичным? Например, у меня есть код, который хорошо реализуется с помощью векторных инструкций 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-код с нативным.

Жаль, что в статье мало раскрыта эта тема и нет ссылок.

Sign up to leave a comment.