Друкарня від WE.UA

Нативна бібліотека

Це бібліотека, написана на мові програмування, яка компілюється безпосередньо в машинний код, специфічний для певної архітектури або операційної системи. Нативні бібліотеки використовуються програмами, що написані на тій же мові програмування або через механізми міжмовної взаємодії, такі як JNA/JNI в Java. Нативні бібліотеки можуть бути як статичними, так і динамічними.

Статична бібліотека

Набір функцій, які включаються безпосередньо в бінарний файл програми на етапі компіляції. Вони стають нероздільною частиною програми.

Динамічна бібліотека

Не включається в бінарний файл програми на етапі компіляції. Замість цього, програми завантажують динамічні бібліотеки в пам'ять під час виконання, коли це необхідно. Декілька програм можуть використовувати одну й ту ж динамічну бібліотеку, що допомагає економити пам'ять.

Динамічні бібліотеки зазвичай мають розширення .dll на Windows, .so на Linux і .dylib на macOS.

І логічно, що завантаження бібліотеки вимагає щоб вона була присутньою на системі під час виконання.

JNA

або Java Native Access — це один з інструментів Java, який дозволяє розробникам забезпечити безпосередній доступ до native-функцій та бібліотек, написаних на C, C++ та інших мовах. Це корисно, коли вам потрібно використовувати функції, які не доступні в стандартній бібліотеці Java, або коли вам потрібно покращити продуктивність за допомогою нативного коду.

Основна концепція полягає в тому, щоб створити Java інтерфейс, що відповідає нативній бібліотеці, і використовувати цей інтерфейс для виклику native-функцій. JNA контролює всі нюанси прив'язки, включаючи перетворення типів даних і виклик функцій.

Що це нам дає?

1. Доступ до native API: Часто Java може не мати доступу до специфічних функцій операційної системи або апаратного забезпечення. JNA дозволяє викликати ці функції напряму.

2. Продуктивність: Деякі операції можуть бути виконані швидше в native-коді, ніж в Java. JNA дозволяє вам використовувати ці оптимізації.

Створення JNA-інтерфейсу

Спершу ви маєте визначити Java інтерфейс, що відображає native-бібліотеку. Цей інтерфейс має включати сигнатури всіх функцій, які ви хочете викликати. Потім ви викликаєте ці функції через JNA, який конвертує Java типи даних у відповідні нативні типи.

Припустимо, ми хочемо викликати getpid (отримати ID потоку) і getenv, який повертає значення змінної оточення. Спочатку, нам потрібно додати залежність JNA до нашого проекту.

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version>
</dependency>

Тепер створимо JNA інтерфейс для бібліотеки libc *, яка містить getpid і getenv:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public interface CLibrary extends Library {
    CLibrary INSTANCE = Native.load((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);

    int getpid();
    String getenv(String name);
}

Main:

public class Main {
    public static void main(String[] args) {
        CLibrary cLibrary = CLibrary.INSTANCE;
        int getpid = cLibrary.getpid();
        System.out.println("Process ID: " + getpid);
        System.out.println("------");
        String path = cLibrary.getenv("PATH");
        System.out.println(path);
    }
}

Result:

Process ID: 10228
------
/opt/homebrew/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin

Process finished with exit code 0

Ми бачимо, що виклик нативної функції відбувається так само, як і виклик звичайного методу.

— дуже абстрактна схема —

Важливо пам'ятати, що використання нативних бібліотек з Java може зробити ваш код менш переносимим і більш схильним до помилок, оскільки він стає залежним від деталей конкретної операційної системи та архітектури процесора. Тому, цей механізм потрібно використовувати обережно.

Які програми використовують JNA?

Intellij IDEA, Elasticsearch, Apache NetBeans IDE, Apache Cassandra, OSHI та інші.

IntelliJ IDEA Community


libc є стандартною бібліотекою C в багатьох системах, основаних на Unix, включаючи Linux та macOS. Вона містить багато стандартних функцій мови C, таких як введення/виведення, робота з рядками, математичні функції тощо.

https://github.com/java-native-access/jna

Статті про вітчизняний бізнес та цікавих людей:

  • Бронеплівка для вікон: коли вона доречна та як обрати рішення

    Як бронеплівка утримує уламки, де її встановлюють та чому перед монтажем важливо оцінити стан і конструкцію скління.

    Теми цього довгочиту:

    Бронеплівка На Вікна
  • Шлейф сучасного смартфону та його призначення

    Шлейф - це тонка пластикова стрічка з ледь видимими доріжками і саме вона зʼєднує важливі компоненти мобільного, без яких він не запрацює. Власники пристроїв Xiaomi, які стикаються з потребою заміни цієї деталі, можуть підібрати відповідний варіант на сайті AKS.UA

    Теми цього довгочиту:

    Шлейф Для Мобільного
  • Чохли для iPhone 15: повний гід по кольорах, матеріалах і виробниках

    Перед тим як вибрати чохли для iPhone 15, варто визначитися, що саме ви хочете отримати від аксесуара. Комусь потрібен тонкий прозорий корпус, інший покупець шукає посилений захист, а для когось вирішальним стане колір або підтримка MagSafe

    Теми цього довгочиту:

    Чохли Для Iphone
  • Як побудована програма Meest China Academy

    Курс про товарний бізнес охоплює різні етапи роботи: від пошуку ідеї до перевірки товару, логістики та масштабування. Програма Meest China Academy містить 17 модулів, які послідовно розкривають ці теми без зведення всього навчання до однієї універсальної поради.

    Теми цього довгочиту:

    Meest
  • Які технології використані в Айфон 17

    Айфон 17 поєднує OLED-дисплей із частотою до 120 Гц, чип A19, дві камери Fusion 48 Мп і швидке заряджання через USB-C. У COMFY можна купити Айфон 17 з накопичувачем на 256 або 512 ГБ, вибравши конфігурацію відповідно до обсягу фото, відео та застосунків

    Теми цього довгочиту:

    Iphone 17
Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

40Довгочити
9.4KПерегляди
104Підписники
На Друкарні з 19 квітня 2023

Більше від автора

  • Java Memory Model ↔ PostgreSQL MVCC: один і той самий фундамент конкурентності

    Java Memory Model та PostgreSQL MVCC/Isolation Levels — це дві відповіді на одне й те саме фундаментальне питання: за яких умов зміна, зроблена одним учасником (потоком / транзакцією), стає видимою для іншого?

    Теми цього довгочиту:

    Java
  • Як виконується SQL-запит

    Сьогодні розберемо, що відбувається з вашим SELECT * FROM users WHERE age > 21 перед тим, як БД поверне вам дані

    Теми цього довгочиту:

    Computer Science

Це також може зацікавити:

Коментарі (1)

Привіт. Гарна тема, останнім часом цікавився нею. Чи можеш ти відписати мені в лінкедині? Хочу декілька запитань спитати стосовно використання JNA/JNI: Vadym Kain | LinkedIn

Це також може зацікавити: