Я столкнулся со многими проблемами при использовании OSGi и JNA.Возможно, это поможет.
Моя первая ошибка состояла не в том, чтобы получить все зависимости в самом начале.Следующие зависимости необходимы.У меня появились странные ошибки, когда я пропустил вторую.
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>4.5.0</version>
</dependency>
Если вы используете свою собственную нативную библиотеку, как я, вам нужно убедиться, что вы скомпилировали ее с 32-битной или 64-битнойКомпилятор в зависимости от системы, на которой он будет работать.
Использование JNA в вашем коде довольно просто.Вам необходимо создать интерфейс, соответствующий методам вашей собственной библиотеки, а затем загрузить библиотеку, как показано ниже.
/** Shared Library libf403.so */
private F403 f403;
/** JNA interface for libf403.so */
private interface F403 extends Library {
int BoardConfig();
int SetOutput(byte channel, byte status);
int GetGroupInputs();
}
f403 = (F403) Native.loadLibrary("f403", F403.class);
f403.BoardConfig();
Если у вас есть собственная библиотека в определенном месте, вы также можете указать путь.Например:
f403 = (F403) Native.loadLibrary("/usr/lib/libf403.so", F403.class);
Теперь на OSGi.Если у вас есть собственная библиотека и вы хотите, чтобы она была внутри банки, вы можете сделать следующее.Поместите нативную библиотеку в вашу исходную папку / scr / main / resources и в папку, которую вы можете назвать сами.В моем примере это linux-x86.
Для описания пакета необходим тег Bundle-NativeCode.Под этим тегом вы можете определить целый список библиотек, операционных систем и процессоров.Я знаю, что мое оборудование и ОС никогда не изменятся.Так что это нормально для меня.
Export-Package:
Import-Package: \
com.sun.jna*;resolution:=optional, \
*
Bundle-NativeCode: \
linux-x86/libf403.so;osname=Linux;processor=x86
-dsannotations: *
-dsannotations-options: norequirements
-metatypeannotations: *
Имейте в виду, что вам не нужен тег Bundle-NativeCode, если у вас нет библиотеки в ваших ресурсах или наоборот.Вы получите только ошибки компиляции.