Comments 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.* которая в теории будет сильно быстрее. Если будет не лень, то померяю
Жду продолжения, очень интересно
JNI Часть 1: Введение