Использование Bundle-NativeCode в Linux не работает - PullRequest
5 голосов
/ 23 января 2009

Я создаю плагин, который включает следующую структуру папок:

  • срк
  • родной / так / libsystemcommand.so
  • META-INF / MANIFEST.MF

Манифест включает команду

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Commands Plug-in
Bundle-SymbolicName: de.system.commands;singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: de.system.commands.CommandsPlugin
Bundle-Localization: plugin
Bundle-NativeCode: native/so/libsystemcommand.so; osname = Linux; processor = x86
Require-Bundle: org.eclipse.core.runtime,
 org.apache.commons.logging
Eclipse-AutoStart: true
Export-Package: de.system.commands,
 de.system.commands.jni,
 de.system.commands.utils
Bundle-ClassPath: .

build.properties выглядит как

source.. = src/
output.. = bin/
bin.includes = META-INF/,\
               .,\
               native/

В методе start моего Activator класса я вызываю

System.loadLibrary("systemcommand");

Во время выполнения библиотека не найдена и выдается UnsatisfiedLinkError .

java.lang.UnsatisfiedLinkError: no libsystemcommand in java.library.path

Нужно ли устанавливать дополнительные атрибуты в плагине? Нужно ли разархивировать некоторые данные на целевой платформе?

EDIT:

java.library.path=/opt/jdk/j2re1.4.2_16/lib/i386/client:/opt/jdk/j2re1.4.2_16/lib/i386:/opt/jdk/j2re1.4.2_16/../lib/i386::/opt/dsa/lib:/opt/dsa/lib

Ответы [ 4 ]

2 голосов
/ 23 января 2009

Интересно, нужно ли указывать библиотеку без префикса lib? Например.,

System.loadLibrary("systemcommand");

Так как библиотека будет передаваться по линии связи gcc.

1 голос
/ 23 января 2009

Я думаю, что нашел решение.

Мы только собираем плагин, который не работал, и копируем его в каталог платформы назначения. После этого мы запускаем приложение как wtach файлы журнала, независимо от того, была ли библиотека скрытой или нет.

Что нам не хватало, так это удалить папку настроек . Новый плагин не был распакован, и в каталоге конфигураций не было библиотеки.

Прошу прощения и спасибо за ваши ответы.

РЕДАКТИРОВАТЬ:

Папка конфигурации находится в

<installation>/eclipse/configuration/

хотя бы удалить все без файла

<installation>/eclipse/configuration/config.ini
1 голос
/ 23 января 2009

Во фрагменте плагина для linux я использую:

Bundle-NativeCode: librptlc.so; osname = linux; processor=x86

А в основном плагине я использую:

if (OS.equals(Platform.OS_LINUX)) {
    System.loadLibrary("rptlc");
}

Это должно работать и в одном плагине.

Кажется, я помню, что у меня были проблемы с библиотеками в подпапке в банке, но я не уверен, почему это так. Я просто придерживался наличия библиотек в корне фрагмента плагина, который работает для меня.

Вы также можете попробовать получить путь к файловой системе библиотеки (не уверен, что это легко) и загрузить ее, используя:

libraryPath = "C:\eclipse\bundles\123\librptlc.so";
System.load(libraryPath);
0 голосов
/ 23 января 2009

Библиотека должна находиться в вашей файловой системе (не в архивном файле). Затем вы можете либо использовать переменную окружения linux LD_LIBRARY_PATH, указывающую на lib, либо определить свойство java.library.path

...