Jump to content

Собственный доступ к Java

Собственный доступ к Java
Оригинальный автор(ы) Тодд Фаст, Тимоти Уолл, Лян Чен
Первоначальный выпуск 9 мая 2007 г. ( 09.05.2007 )
Стабильная версия
5.14.0 / 10 декабря 2023 г .; 7 месяцев назад ( 10.12.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 /джна

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] При оценке этих инструментов разработки программного обеспечения следует учитывать компромисс между простотой реализации кода и скоростью выполнения. Добавление сторонних зависимых библиотек, которые необходимо распространять и обновлять, является еще одним фактором, влияющим на решение, какой инструмент использовать. уровень готовности технологий Также следует учитывать .

См. также

[ редактировать ]
  1. ^ «Выпуск 5.14.0» . Гитхаб . 14 января 2023 г.
  2. ^ «Сопоставление типов по умолчанию» . jna.dev.java.net . Проверено 2 августа 2011 г.
  3. ^ «Производительность JNI и JNA» . Реддит . Проверено 30 марта 2023 г.
  4. ^ «JNI против JNA. Эталонный тест» . Середина . Проверено 30 марта 2023 г.
  5. ^ «Оценка производительности JNI и JNA» . Переполнение стека . Переполнение стека . Проверено 30 марта 2023 г.
  6. ^ «Появляются альтернативы JNI» . ОКТА . Проверено 30 марта 2023 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 819d6318f0e621ab2fc4e039caf11c49__1711111500
URL1:https://arc.ask3.ru/arc/aa/81/49/819d6318f0e621ab2fc4e039caf11c49.html
Заголовок, (Title) документа по адресу, URL1:
Java Native Access - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)