Автор (ы) оригинала | Тодд Фаст, Тимоти Уолл, Лян Чен |
---|---|
Первый выпуск | 9 мая 2007 г. |
Стабильный выпуск | 5.6.0 / 19 июля 2020 г . [1] |
Репозиторий | |
Написано в | C и Java |
Операционная система | Windows, macOS, Android, AIX, FreeBSD, GNU / Linux , OpenBSD, Solaris, Windows Mobile |
Платформа | Java 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 Native Access ( JNA ) - это библиотека, разработанная сообществом, которая обеспечивает программам Java легкий доступ к собственным разделяемым библиотекам без использования Java Native Interface (JNI). Дизайн JNA направлен на обеспечение естественного доступа с минимальными усилиями. В отличие от JNI, не требуется шаблонный или сгенерированный связующий код .
Архитектура [ править ]
Библиотека JNA использует небольшую собственную библиотеку, называемую библиотекой интерфейса внешних функций ( libffi ), для динамического вызова собственного кода . Библиотека JNA использует собственные функции, позволяющие коду загружать библиотеку по имени и извлекать указатель на функцию в этой библиотеке, и использует библиотеку libffi для ее вызова, и все это без статических привязок , файлов заголовков или какой-либо фазы компиляции. Разработчик использует интерфейс Java для описания функций и структур в целевой нативной библиотеке. Это позволяет легко использовать преимущества встроенных функций платформы без больших накладных расходов на разработку, связанных с настройкой и сборкой JNI. код.
JNA создана и протестирована на macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , GNU с Linux , AIX , Windows Mobile и Android . Также можно настроить и перекомпилировать собственные конфигурации сборки, чтобы заставить их работать на большинстве других платформ, на которых работает Java.
Типы карт [ править ]
В следующей таблице показан обзор сопоставления типов между Java и собственным кодом, поддерживаемых библиотекой JNA. [2]
Родной тип | Размер | Тип Java | Общие типы окон |
---|---|---|---|
символ | 8-битное целое число | байт | БАЙТ, ЧАР |
короткая | 16-битное целое число | короткая | СЛОВО |
wchar_t | 16/32-битный символ | символ | ТЧАР |
int | 32-битное целое число | int | DWORD |
int | логическое значение | логический | BOOL |
длинный | 32/64-битное целое число | Родной | ДЛИННЫЙ |
долго долго | 64-битное целое число | длинный | __int64 |
плавать | 32-битный FP | плавать | |
двойной | 64-битный FP | двойной | |
символ * | Строка C | Нить | LPCSTR |
пустота* | указатель | Указатель | LPVOID, РУЧКА, LPXXX |
Примечание: значение TCHAR меняется между char и wchar_t в соответствии с некоторыми определениями препроцессора. LPCTSTR следует.
Выравнивание байтов памяти для структур данных [ править ]
В собственных библиотеках нет стандартизованного варианта выравнивания байтов памяти. По умолчанию JNA использует настройку, зависящую от платформы ОС, которая может быть отменена настраиваемым выравниванием для конкретной библиотеки. Если детали выравнивания не указаны в документации собственной библиотеки, правильное выравнивание должно быть определено методом проб и ошибок во время реализации оболочки Java.
Пример [ править ]
Следующая программа загружает реализацию локальной стандартной библиотеки C и использует ее для вызова функции printf .
Примечание . Следующий код является переносимым и одинаково работает на платформах Windows и POSIX ( GNU + Linux / Unix / macOS ).
import com.sun.jna.Library ; import com.sun.jna.Native ; import com.sun.jna.Platform ;/ ** Простой пример объявления и использования нативной библиотеки. * / public class HelloWorld { публичный интерфейс CLibrary расширяет библиотеку { CLibrary INSTANCE = ( CLibrary ) Native . loadLibrary ( ( Platform . isWindows () ? "msvcrt" : "c" ), CLibrary . class ); void printf ( формат строки , Object ... args ); } public static void main ( String [] args ) { CLibrary . ЭКЗЕМПЛЯР . printf ( "Привет, мир \ n" ); for ( int i = 0 ; i < args . length ; i ++ ) { CLibrary . ЭКЗЕМПЛЯР . printf ( "Аргумент% d:% s \ n" , i , args [ i ] ); } } }
Следующая программа загружает библиотеку C POSIX и использует ее для вызова стандартной функции mkdir .
Примечание . Следующий код является переносимым и одинаково работает на платформах стандартов POSIX .
import com.sun.jna.Library ; import com.sun.jna.Native ;/ ** Простой пример объявления и использования собственной библиотеки C POSIX. * / публичный класс ExampleOfPOSIX { публичный интерфейс POSIX расширяет библиотеку { public int chmod ( String filename , int mode ); public int chown ( String filename , int user , int group ); public int rename ( String oldpath , String newpath ); общественный int kill ( int pid , int сигнал ); общедоступная ссылка int ( String oldpath , String newpath ); public int mkdir ( строковый путь , режим int ); public int rmdir ( строковый путь ); } public static void main ( String [] args ) { // Можно загрузить msvcrt для его частичной поддержки POSIX в Windows ... POSIX posix = ( POSIX ) Native . loadLibrary ( "c" , POSIX . класс ); // но он все равно не сработает в Windows из-за отсутствия / tmp. posix . mkdir ( "/ tmp / newdir" , 0777 ); posix . переименовать ( "/ tmp / newdir" ,"/ tmp / renamedir" ); } }
Программа ниже загружает Kernel32.dll и использует его для вызова функций Beep и Sleep .
Примечание . Следующий код работает только на платформах Windows .
import com.sun.jna.Library ; import com.sun.jna.Native ;/ ** Простой пример объявления и использования нативной библиотеки Windows. * / public class BeepExample { общедоступный интерфейс Kernel32 расширяет библиотеку { // ЧАСТОТА выражается в герцах и находится в диапазоне от 37 до 32767 // DURATION выражается в миллисекундах public boolean Beep ( int FREQUENCY , int DURATION ); public void Sleep ( int DURATION ); } public static void main ( String [] args ) { Kernel32 lib = ( Kernel32 ) Собственный . loadLibrary ( " ядро32 " , Kernel32 . класс ); lib . Beep ( 698 , 500 ); lib . Сон ( 500 ); lib . Beep ( 698 , 500 ); } }
См. Также [ править ]
- JNAerator
- P / Invoke
- SWIG
Ссылки [ править ]
- ^ "Выпуск 5.6.0" . github.com . 2020-07-19.
- ^ «Сопоставления типов по умолчанию» . jna.dev.java.net . Проверено 2 августа 2011 . CS1 maint: discouraged parameter (link)
Внешние ссылки [ править ]
- Веб-страница Java Native Access
- Java Native Access - страница загрузки
- Собственный доступ Java - список рассылки пользователей
- Фризен, Джефф (5 февраля 2008 г.). «Проекты Java с открытым исходным кодом: Java Native Access» . Учебники по Java с открытым исходным кодом. JavaWorld . Проверено 27 июля 2020 . CS1 maint: discouraged parameter (link)
- Моррис, Стивен Б. (20 мая 2009 г.). «Защитите свои вложения в унаследованный код с помощью JNA» . today.java.net . Архивировано из оригинала на 2015-01-13.
- Дасгупта, Санджай (11 ноября 2009 г.). «Упростите доступ к собственному коду с помощью JNA» . today.java.net . Архивировано из оригинала на 2009-11-15.
- Дубровкин, Даниэль (20 июня 2011 г.). «JNA теперь Githubber» . code.dblock.org . Проверено 27 июля 2020 . CS1 maint: discouraged parameter (link)
- Киэр, Джеспер (21 марта 2010 г.). «Вызов C-API Lotus Domino с помощью JNA» . Nevermind.dk . Проверено 27 июля 2020 . CS1 maint: discouraged parameter (link)