Собственный доступ Java - Java Native Access

Собственный доступ Java
Оригинальный автор (ы)Тодд Фаст, Тимоти Уолл, Лян Чен
изначальный выпуск9 мая 2007 г. (2007-05-09)
Стабильный выпуск
5.6.0 / 19 июля 2020 г.; 4 месяца назад (2020-07-19)[1]
Репозиторий Отредактируйте это в Викиданных
Написано вC и Ява
Операционная системаWindows, macOS, Android, AIX, FreeBSD, GNU /Linux, OpenBSD, Solaris, Windows Mobile
ПлатформаЯва 1.4 или новее (для JNA 3.5.2 или более ранней версии), Java 1.6 для JNA 4.0.0 и новее
Размер1,83 МБ (в архиве)
ТипБиблиотека программного обеспечения
ЛицензияLGPL версия 2.1 или новее и (начиная с версии 4.0 и выше) лицензию на программное обеспечение Apache версии 2.0
Интернет сайтgithub.com/ java-native-доступ/ jna

Собственный доступ Java (JNA) - это библиотека, разработанная сообществом, которая предоставляет Ява программы легкий доступ к собственные общие библиотеки без использования Собственный интерфейс Java (JNI). Дизайн JNA направлен на обеспечение естественного доступа с минимальными усилиями. В отличие от JNI, нет шаблон или сгенерировано клей код необходимо.

Архитектура

Библиотека JNA использует небольшую собственную библиотеку под названием интерфейс внешней функции библиотека (libffi ) для динамического вызова собственный код. Библиотека JNA использует собственные функции, позволяющие коду загружать библиотеку по имени и извлекать указатель к функции в этой библиотеке и использует libffi библиотека для его вызова, все без статические привязки, файлы заголовков, или любой этап компиляции. Разработчик использует Java интерфейс для описания функций и структур в целевой нативной библиотеке. Это позволяет легко использовать преимущества встроенных функций платформы без больших накладных расходов на разработку, связанных с настройкой и сборкой. JNI код.

JNA построен и протестирован на macOS, Майкрософт Виндоус, FreeBSD / OpenBSD, Солярис, GNU с Linux, AIX, Windows Mobile, и Android. Также можно настроить и перекомпилировать собственные конфигурации сборки, чтобы заставить их работать на большинстве других платформ, на которых работает Java.

Типы картографии

В следующей таблице показан обзор сопоставления типов между Java и собственным кодом и поддерживаемых библиотекой JNA.[2]

Родной типРазмерТип JavaОбщие типы окон
char8-битное целое числобайтБАЙТ, ЧАР
короткая16-битное целое числокороткаяСЛОВО
wchar_t16/32-битный символcharТЧАР
int32-битное целое числоintDWORD
intлогическое значениелогическийBOOL
длинный32/64-битное целое числоРоднойДЛИННЫЙ
долго долго64-битное целое числодлинный__int64
плавать32-битный FPплавать
двойной64-битный FPдвойной
char *C строкаНитьLPCSTR
пустота*указательУказательLPVOID, РУЧКА, LPXXX

Примечание: Значение TCHAR меняется между char и wchar_t в соответствии с некоторыми определениями препроцессора. LPCTSTR следует.

Выравнивание байтов памяти для структур данных

В собственных библиотеках нет стандартизированной функции выравнивания байтов памяти. По умолчанию JNA использует настройку, зависящую от платформы ОС, которая может быть отменена настраиваемым выравниванием для конкретной библиотеки. Если детали выравнивания не указаны в документации собственной библиотеки, правильное выравнивание должно быть определено методом проб и ошибок во время реализации оболочки Java.

Пример

Следующая программа загружает локальный Стандартная библиотека C реализация и использует его для вызова printf функция.

Примечание: Следующий код переносится и работает так же на Windows и GNU +Linux / Unix / macOS платформы.

импорт com.sun.jna.Library;импорт com.sun.jna.Native;импорт com.sun.jna.Platform;/ ** Простой пример объявления и использования нативной библиотеки. * /общественный учебный класс Привет, мир {    общественный интерфейс Библиотека расширяет Библиотека {        Библиотека ПРИМЕР = (Библиотека) Родные.loadLibrary(            (Платформа.isWindows() ? "msvcrt" : "c"), Библиотека.учебный класс);        пустота printf(Нить формат, Объект... аргументы);    }    общественный статический пустота главный(Нить[] аргументы) {        Библиотека.ПРИМЕР.printf("Привет, мир  n");        за (int я = 0; я < аргументы.длина; я++) {            Библиотека.ПРИМЕР.printf("Аргумент% d:% s  n", я, аргументы[я]);        }    }}

Следующая программа загружает Библиотека C POSIX и использует его для вызова стандарта mkdir функция.

Примечание: Следующий код переносится и работает так же на POSIX платформы стандартов.

импорт com.sun.jna.Library;импорт com.sun.jna.Native;/ ** Простой пример объявления и использования собственной библиотеки C POSIX. * /общественный учебный класс Пример из POSIX {    общественный интерфейс POSIX расширяет Библиотека {	    общественный int chmod(Нить имя файла, int Режим);	    общественный int Chown(Нить имя файла, int Пользователь, int группа);	    общественный int переименовать(Нить старый путь, Нить новый путь);	    общественный int убийство(int пид, int сигнал);	    общественный int связь(Нить старый путь, Нить новый путь);	    общественный int mkdir(Нить дорожка, int Режим);	    общественный int rmdir(Нить дорожка);    }    общественный статический пустота главный(Нить[] аргументы) {        POSIX Posix = (POSIX) Родные.loadLibrary("c", POSIX.учебный класс);	    Posix.mkdir("/ tmp / newdir", 0777);	    Posix.переименовать("/ tmp / newdir","/ tmp / renamedir");    }}

Программа ниже загружает Kernel32.dll и использует его для вызова Звуковой сигнал и Спать функции.

Примечание: Следующий код работает только на Windows платформы.

импорт com.sun.jna.Library;импорт com.sun.jna.Native;/ ** Простой пример объявления и использования собственной библиотеки Windows. * /общественный учебный класс BeepExample {    общественный интерфейс Ядро32 расширяет Библиотека {        // ЧАСТОТА выражается в герцах и находится в диапазоне от 37 до 32767        // DURATION выражается в миллисекундах        общественный логический Звуковой сигнал(int ЧАСТОТА, int ПРОДОЛЖИТЕЛЬНОСТЬ);        общественный пустота Спать(int ПРОДОЛЖИТЕЛЬНОСТЬ);    }    общественный статический пустота главный(Нить[] аргументы) {	    Ядро32 lib = (Ядро32) Родные.loadLibrary("kernel32", Ядро32.учебный класс);	    lib.Звуковой сигнал(698, 500);	    lib.Спать(500);	    lib.Звуковой сигнал(698, 500);    }}

Смотрите также

Рекомендации

  1. ^ «Выпуск 5.6.0». github.com. 2020-07-19.
  2. ^ «Сопоставления типов по умолчанию». jna.dev.java.net. Получено 2011-08-02.

внешняя ссылка