Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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]

Примечание: значение 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

Ссылки [ править ]

  1. ^ "Выпуск 5.6.0" . github.com . 2020-07-19.
  2. ^ «Сопоставления типов по умолчанию» . 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)