Как стать автором
Обновить

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

А нет ничего такого в Андроиде типа JNA, JNR как под JAVA? Я помню с JNI было очень неудобно работать.

Привет! Да, я в начале статьи приложил ссылку на NDK.
В андроиде использовать native удобнее, все автоматизировано из коробки и нет необходимости выполнять какие либо команды в консоли. В третей статье, которая выйдет 15 февраля и будет про perfomance я приведу пример использования NDK и ссылку на репозиторий.

Спасибо. А минимальная версия какая Андроида под него?

Лично я в ходе изучения не видел никаких ограничений на минимальную версию API. Точно работает на версиях >= API 18. На более ранних версиях поддержка то же есть, но с некоторыми особенностями описанными на это странице developer.android.com

А он вроде там точно такой же:

Supported Platforms

JNA will build on most linux-like platforms with a reasonable set of GNU tools and a JDK. See the native Makefile for native configurations that have been built and tested. If your platform is supported by libffi, then chances are you can build JNA for it.

Pre-built platform support may be found here.

minGV x64

Это было смешно, однако оно называется MinGW-w64.

нужно обязательно установить

Ну, в Linux необязательно.

И зачем разделять шаги 8 и 9? (в данном примере)

Спасибо за внимательность :) был не прав, исправлюсь.
По поводу шагов, не знаю что ответить, посчитал, что так прозрачнее последовательность действий.

Надо отметить что следующий код будет выполнен только один раз

System.loadLibrary("nativeLib");

Вне зависимости сколько классов попытаются вызвать привязку нативных методов.

Как итог JDBC driver которые используют JNI будут работать только для первой загрузки classLoader. В качестве решения JDBC driver кладут в системные библиотеки IoC контейнера.

Эту проблемму позволяет избежать если привязывать нативные функции из С кода

jint RegisterNatives(JNIEnv *env, jclass clazz,
const JNINativeMethod *methods, jint nMethods);

Также надо обратить внимание на управление пямятью, чтобы нативный код не стал обращяться к уже освобожденно или перемещенной переменной.

Но меня поразил большой бенефит когда идет вызов вложенных функций С++ -> Java -> C++ -> Java
То stacktrace в Exception показывает вызовы как Java так и С++ функций.

Автор, если у Вас появится время и желание, то очень хотелось бы увидеть статью со сравнением JNI и подходом предлагаемым JEP 419. Думаю эта тема будет интересна многим.

https://github.com/zakgof/java-native-benchmark

вот тут например сравнение. При удобстве API, без необходимости писать лишние обертки на сях, примерно тот же результат.

Есть еще одна штука не покрытая. А именно GraalVM и org.graalvm.nativeimage.c.* которая в теории будет сильно быстрее. Если будет не лень, то померяю

Жду продолжения, очень интересно

Зарегистрируйтесь на Хабре, чтобы оставить комментарий