Собственный доступ к Java - Java Native Access
| Автор (ы) оригинала | Тодд Фаст, Тимоти Уолл, Лян Чен |
|---|---|
| Первый выпуск | 9 мая 2007 г. |
| Стабильный выпуск | 5.8.0 / 22 марта 2021 г .
|
| Репозиторий | |
| Написано в | C и Java |
| Операционная система | 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 Native Interface (JNI). Дизайн JNA направлен на обеспечение естественного доступа с минимальными усилиями. В отличие от JNI, не требуется шаблонный или сгенерированный связующий код .
Архитектура
Библиотека JNA использует небольшую собственную библиотеку, называемую библиотекой интерфейса внешних функций ( libffi ), для динамического вызова собственного кода . Библиотека JNA использует собственные функции, позволяющие коду загружать библиотеку по имени и извлекать указатель на функцию в этой библиотеке, а также использует библиотеку libffi для ее вызова, и все это без статических привязок , файлов заголовков или какой-либо фазы компиляции. Разработчик использует интерфейс Java для описания функций и структур в целевой нативной библиотеке. Это позволяет легко использовать преимущества встроенных функций платформы без больших накладных расходов на разработку, связанных с настройкой и сборкой кода JNI .
JNA создана и протестирована на macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile и Android . Также можно настроить и перекомпилировать собственные конфигурации сборки, чтобы заставить их работать на большинстве других платформ, на которых работает Java.
Типы картографии
В следующей таблице показан обзор сопоставления типов между Java и собственным кодом, поддерживаемых библиотекой JNA.
| Родной тип | Размер | Тип 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;
/** 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);
}
}
Смотрите также
использованная литература
внешние ссылки
- Веб-страница Java Native Access
- Java Native Access - страница загрузки
- Java Native Access - список рассылки пользователей
- Фризен, Джефф (5 февраля 2008 г.). «Проекты Java с открытым исходным кодом: Java Native Access» . Учебники по Java с открытым исходным кодом. JavaWorld . Проверено 27 июля 2020 .
- Моррис, Стивен Б. (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 .
- Киэр, Джеспер (21 марта 2010 г.). «Вызов C-API Lotus Domino с помощью JNA» . Nevermind.dk . Проверено 27 июля 2020 .