2009-01-23 14 views
5

utworzyć plugin, który zawiera następującą strukturę folderu:Zastosowanie Bundle-NativeCode na Linuksie nie działa

  • src
  • natywny/tak/libsystemcommand.so
  • META-INF/MANIFEST.MF

manifestu obejmują polecenie

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: . 

W build.properties wygląda

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

W metodzie startu mojego Activator klasy wzywam

System.loadLibrary("systemcommand"); 

W czasie wykonywania biblioteka nie zostanie znaleziony i UnsatisfiedLinkError jest wyrzucane.

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

Czy muszę ustawić więcej atrybutów w wtyczce? Czy muszę rozpakować niektóre informacje na platformie docelowej?

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 
+0

co masz w swojej java.library.path? – dsm

Odpowiedz

1

Myślę, że znalazłem rozwiązanie.

Budujemy tylko wtyczkę, która nie działała i skopiuj ją do katalogu platformy docelowej. Po tym uruchamiamy aplikację jako wtach pliki dziennika, czy biblioteka była foud, czy nie.

To, czego nam brakuje, to usunąć folder konfiguracji. Nowa wtyczka nie była unzippem, a biblioteka nie istniała w katalogu konfiguracyjnym.

Przykro mi i dziękuję za odpowiedzi.

EDIT:

Folder konfiguracyjny jest umieszczony w

<installation>/eclipse/configuration/ 

Przynajmniej usunąć wszystko bez pliku

<installation>/eclipse/configuration/config.ini 
+0

Łatwo popełnić błąd, trudno zauważyć konsekwencje. To samo przydarzyło mi się ... –

+0

@Markus Lausberg - Myślę, że mam ten sam problem, ale nie rozumiem, co masz na myśli "usuń folder konfiguracji". Gdzie to jest i jak można go usunąć? – MrMas

+0

Poprawiłem moją odpowiedź i wydrukowałem ścieżkę do folderu konfiguracji do –

0

lib musi być w systemie plików (nie w pliku archiwum). Następnie można użyć zmiennej środowiskowej linux LD_LIBRARY_PATH wskazującej bibliotekę lub definiującej właściwość java.library.path

+0

Spodziewam się, że wtyczka zrobi to na mój sposób, ponieważ na platformach Windows działa to bez dodatkowej ścieżki biblioteki. –

+0

@flolo - jesteś w błędzie; struktura Eclipse obsługuje ładowanie natywnych bibliotek z pakietów wtyczek (plików JAR). – McDowell

2

Zastanawiam się, czy biblioteka musi zostać określona bez prefiksu lib? Np.,

System.loadLibrary("systemcommand"); 

Ponieważ w ten sposób biblioteka zostanie przekazana na linii łącza gcc.

+0

Dzięki, ale to też nie działa. –

+0

http://mindprod.com/jgloss/runerrormessages.html#UNSATISFIEDLINKERROR sugeruje, że przeciwna (dodaj przyrostek .so) jest właściwą odpowiedzią. –

+0

miałeś rację !!! biblioteka musi załadować się z uruchomieniem "lib" –

1

W fragmentu Plugin for Linux, używam:

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

A w głównej wtyczce używam:

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

ten powinien działać w ramach jednej wtyczki też.

Mam wrażenie, że mam problemy z bibliotekami w podkatalogu w słoiku, ale nie jestem pewien, dlaczego tak się stało. Po prostu trzymałem się bibliotek w katalogu głównym fragmentu wtyczki, który działa dla mnie.

Można również próbować coraz ścieżkę systemu plików biblioteki (nie wiem, czy to łatwe) i ładuje go za pomocą:

libraryPath = "C:\eclipse\bundles\123\librptlc.so"; 
System.load(libraryPath); 
Powiązane problemy