Собственный доступ к Java
Оригинальный автор(ы) | Тодд Фаст, Тимоти Уолл, Лян Чен |
---|---|
Первоначальный выпуск | 9 мая 2007 г. |
Стабильная версия | 5.14.0
/ 10 декабря 2023 г [1] |
Репозиторий | |
Написано в | Си и Ява |
Операционная система | Windows, macOS, Android, AIX, FreeBSD, 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 (JNI). Дизайн JNA направлен на обеспечение естественного доступа с минимальными усилиями. В отличие от JNI, не никакого шаблонного или сгенерированного связующего кода требуется .
Архитектура
[ редактировать ]Библиотека JNA использует небольшую собственную библиотеку, называемую библиотекой интерфейса внешних функций ( libffi ), для динамического вызова собственного кода . Библиотека JNA использует собственные функции, позволяющие коду загружать библиотеку по имени и получать указатель на функцию в этой библиотеке, а также использует библиотеку libffi для ее вызова, и все это без статических привязок , файлов заголовков или какой-либо фазы компиляции. Разработчик использует интерфейс Java для описания функций и структур целевой собственной библиотеки. Это позволяет довольно легко воспользоваться преимуществами встроенных функций платформы без больших затрат на разработку, связанных с конфигурированием и созданием кода JNI .
JNA создан и протестирован на macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile и Android . Также можно настроить и перекомпилировать собственные конфигурации сборки, чтобы они работали на большинстве других платформ, на которых работает Java.
Типы сопоставления
[ редактировать ]В следующей таблице показан обзор сопоставления типов между Java и собственным кодом, поддерживаемого библиотекой JNA. [2]
Родной тип | Размер | Тип Java | Распространенные типы Windows |
---|---|---|---|
голец | 8-битное целое число | байт | БАЙТ, ЧАР |
короткий | 16-битное целое число | короткий | СЛОВО |
wchar_t | 16/32-битный персонаж | голец | ЧАР |
интервал | 32-битное целое число | интервал | ДВОРД |
интервал | логическое значение | логическое значение | БООЛ |
длинный | 32/64-битное целое число | Роднойдлинный | ДЛИННЫЙ |
долго долго | 64-битное целое число | длинный | __int64 |
плавать | 32-битный ФП | плавать | |
двойной | 64-битный ФП | двойной | |
символ * | струна до | Нить | ЛКПСТР |
пустота* | указатель | Указатель | LPVOID, РУЧКА, LPXXX |
Примечание: Значение TCHAR изменяется между чар и wchar_t согласно некоторым определениям препроцессора. Далее следует LPCTSTR .
Выравнивание байтов памяти для структур данных
[ редактировать ]Нативные библиотеки не имеют стандартизированного выравнивания байтов памяти. По умолчанию JNA использует настройку, специфичную для платформы ОС, которую можно переопределить с помощью пользовательского выравнивания, специфичного для библиотеки. Если детали выравнивания не указаны в документации собственной библиотеки, правильное выравнивание должно определяться методом проб и ошибок во время реализации оболочки Java.
Пример
[ редактировать ]Следующая программа загружает реализацию локальной стандартной библиотеки C и использует ее для вызова функции printf .
Примечание. Следующий код является переносимым и одинаково работает на платформах Windows и POSIX ( Linux / Unix / macOS ).
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of native library declaration and usage. */
public class HelloWorld {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
(Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i = 0; i < args.length; i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
Следующая программа загружает библиотеку C POSIX и использует ее для вызова стандартной функции mkdir .
Примечание. Следующий код является переносимым и работает одинаково на POSIX платформах стандартов .
import com.sun.jna.Library;
import com.sun.jna.Native;
/** Simple example of native C POSIX library declaration and usage. */
public class ExampleOfPOSIX {
public interface POSIX extends Library {
public int chmod(String filename, int mode);
public int chown(String filename, int user, int group);
public int rename(String oldpath, String newpath);
public int kill(int pid, int signal);
public int link(String oldpath, String newpath);
public int mkdir(String path, int mode);
public int rmdir(String path);
}
public static void main(String[] args) {
// It is possible to load msvcrt for its partial POSIX support on Windows...
POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class);
// but it will still fail on Windows due to /tmp being missing.
posix.mkdir("/tmp/newdir", 0777);
posix.rename("/tmp/newdir","/tmp/renamedir");
}
}
Программа ниже загружает Kernel32.dll и использует его для вызова функций Beep и Sleep .
Примечание. Следующий код работает только на платформах Windows .
import com.sun.jna.Library;
import com.sun.jna.Native;
/** Simple example of Windows native library declaration and usage. */
public class BeepExample {
public interface Kernel32 extends Library {
// FREQUENCY is expressed in hertz and ranges from 37 to 32767
// DURATION is expressed in milliseconds
public boolean Beep(int FREQUENCY, int DURATION);
public void Sleep(int DURATION);
}
public static void main(String[] args) {
Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
lib.Beep(698, 500);
lib.Sleep(500);
lib.Beep(698, 500);
}
}
Производительность
[ редактировать ]Тесты показывают, что средние значения JNA в десять раз медленнее, чем JNI. [3] [4] [5]
Альтернативы
[ редактировать ]Появляется несколько альтернатив. [6] При оценке этих инструментов разработки программного обеспечения следует учитывать компромисс между простотой реализации кода и скоростью выполнения. Добавление сторонних зависимых библиотек, которые необходимо распространять и обновлять, является еще одним фактором, влияющим на решение, какой инструмент использовать. уровень готовности технологий Также следует учитывать .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Выпуск 5.14.0» . Гитхаб . 14 января 2023 г.
- ^ «Сопоставление типов по умолчанию» . jna.dev.java.net . Проверено 2 августа 2011 г.
- ^ «Производительность JNI и JNA» . Реддит . Проверено 30 марта 2023 г.
- ^ «JNI против JNA. Эталонный тест» . Середина . Проверено 30 марта 2023 г.
- ^ «Оценка производительности JNI и JNA» . Переполнение стека . Переполнение стека . Проверено 30 марта 2023 г.
- ^ «Появляются альтернативы JNI» . ОКТА . Проверено 30 марта 2023 г.
Внешние ссылки
[ редактировать ]- Веб-страница собственного доступа к Java
- Собственный доступ к Java — страница загрузки
- Java Native Access — список рассылки пользователей
- Фризен, Джефф (5 февраля 2008 г.). «Java-проекты с открытым исходным кодом: Java Native Access» . Учебные пособия по Java с открытым исходным кодом. JavaWorld . Проверено 27 июля 2020 г.
- Моррис, Стивен Б. (20 мая 2009 г.). «Защитите свои инвестиции в устаревший код с помощью JNA» . Today.java.net . Архивировано из оригинала 13 января 2015 г.
- Дасгупта, Санджай (11 ноября 2009 г.). «Упрощение доступа к собственному коду с помощью JNA» . сегодня.java.net . Архивировано из оригинала 15 ноября 2009 г.
- Дубровкин, Даниил (20 июня 2011 г.). «JNA теперь является Githubber» . code.dblock.org . Проверено 27 июля 2020 г.
- Киэр, Джеспер (21 марта 2010 г.). «Вызов C-API Lotus Domino с помощью JNA» . Nevermind.dk . Проверено 27 июля 2020 г.