Собственный доступ Java - Java Native Access
Оригинальный автор (ы) | Тодд Фаст, Тимоти Уолл, Лян Чен |
---|---|
изначальный выпуск | 9 мая 2007 г. |
Стабильный выпуск | 5.6.0 / 19 июля 2020 г.[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 |
Собственный доступ 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 | Общие типы окон |
---|---|---|---|
char | 8-битное целое число | байт | БАЙТ, ЧАР |
короткая | 16-битное целое число | короткая | СЛОВО |
wchar_t | 16/32-битный символ | char | ТЧАР |
int | 32-битное целое число | int | DWORD |
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); }}
Смотрите также
Рекомендации
- ^ «Выпуск 5.6.0». github.com. 2020-07-19.
- ^ «Сопоставления типов по умолчанию». jna.dev.java.net. Получено 2011-08-02.
внешняя ссылка
- Веб-страница Java Native Access
- Java Native Access - страница загрузки
- Java Native Access - список рассылки пользователей
- Фризен, Джефф (5 февраля 2008 г.). «Проекты Java с открытым исходным кодом: Java Native Access». Учебники по Java с открытым исходным кодом. JavaWorld. Получено 2020-07-27.
- Моррис, Стивен Б. (20 мая 2009 г.). «Защитите свои вложения в унаследованный код с помощью JNA». today.java.net. Архивировано из оригинал на 2015-01-13.
- Дасгупта, Санджай (11 ноября 2009 г.). «Упростите доступ к собственному коду с помощью JNA». today.java.net. Архивировано из оригинал на 15.11.2009.
- Дубровкин, Даниэль (20 июня 2011 г.). "JNA теперь Githubber". code.dblock.org. Получено 2020-07-27.
- Киэр, Джеспер (21 марта 2010 г.). «Вызов C-API Lotus Domino с помощью JNA». Nevermind.dk. Получено 2020-07-27.