нерешенное требование osgi: osgi.native - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь позвонить из пакета в нативную библиотеку, используя JNA.Сам код работает нормально.В качестве контейнера я использую караф, который я не могу изменить.Пакет находится в состоянии «Установлено», и при попытке его запуска я получаю следующую ошибку:

Error executing command: Error executing command on bundles:
        Error starting bundle 87: Could not resolve module: de.db.fkfmip.preparation.fkfmip-preparation-v2-gpio-nsb [87]
  Unresolved requirement: Require-Capability: osgi.native; native.paths.0:List<String>="libf403.so"; native.paths.2:List<String>="libf403.so"; native.paths.1:List<String>="libf403.so"; native.paths.4:List<String>="libf403.so"; native.paths.3:List<String>="libf403.so"; native.paths.5:List<String>="libf403.so"; filter:="(|(&(osgi.native.osname~=Linux)(osgi.native.processor~=ARM))(&(osgi.native.osname~=Linux)(osgi.native.processor~=arm_le))(&(osgi.native.osname~=Linux)(osgi.native.processor~=arm_be))(&(osgi.native.osname~=Linux)(osgi.native.processor~=x86-64))(&(osgi.native.osname~=Linux)(osgi.native.processor~=x86_64))(&(osgi.native.osname~=Linux)(osgi.native.processor~=arm)))"

Вот скриншот моей консоли karaf: Консоль Karaf

Я убедился, что я добавил тег Bundle-NativeCode в свой файл osgi.bnd

Bundle-NativeCode: \
    libf403.so;osname=Linux;processor=ARM,\
    libf403.so;osname=Linux;processor=arm_le,\
    libf403.so;osname=Linux;processor=arm_be,\
    libf403.so;osname=Linux;processor=x86-64,\
    libf403.so;osname=Linux;processor=x86_64,\
    libf403.so;osname=Linux;processor=arm

Он соответствует моей системе openSUSE 42.3.

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit

Я не являюсьуверен, что я скучаю.Нужно ли устанавливать что-то дополнительное, чтобы karaf мог работать с osgi.native?

1 Ответ

0 голосов
/ 05 июля 2018

Я столкнулся со многими проблемами при использовании 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, если у вас нет библиотеки в ваших ресурсах или наоборот.Вы получите только ошибки компиляции.

...