5 Stimmen

Verwendung von Bundle-NativeCode unter Linux funktioniert nicht

Ich erstelle ein Plugin, das die folgende Ordnerstruktur enthält:

  • src
  • native/so/libsystemcommand.so
  • META-INF/MANIFEST.MF

Das Manifest enthält den Befehl

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

Die build.properties sieht wie folgt aus

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

In der Startmethode meiner Activator Klasse nenne ich

System.loadLibrary("systemcommand");

Zur Laufzeit wird die Bibliothek nicht gefunden und eine UnsatisfiedLinkError geworfen wird.

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

Muss ich weitere Attribute im Plugin einstellen? Muss ich einige Informationen auf der Zielplattform entpacken?

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 Stimmen

Was haben Sie in Ihrem java.library.path?

2voto

Ich frage mich, ob die Bibliothek ohne das Präfix lib angegeben werden muss? Z.B.,

System.loadLibrary("systemcommand");

Da dies die Art ist, wie die Bibliothek auf einer gcc-Link-Zeile übergeben werden würde.

1voto

flolo Punkte 14497

Die Bibliothek muss sich in Ihrem Dateisystem befinden (nicht in einer Archivdatei). Dann können Sie entweder die Linux-Umgebungsvariable LD_LIBRARY_PATH die auf die Bibliothek verweist, oder definieren Sie die Eigenschaft java.library.path

1voto

Kothar Punkte 6511

In einem Plugin-Fragment für Linux, verwende ich:

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

Und im Hauptplugin, das ich verwende:

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

Dies sollte auch innerhalb eines Plugins funktionieren.

Ich glaube mich zu erinnern, dass ich einige Probleme mit Bibliotheken in einem Unterordner des Jars hatte, aber ich bin mir nicht sicher, warum dies der Fall sein sollte. Ich habe gerade geklebt, um mit den Bibliotheken in der Wurzel eines Plugin-Fragment stattdessen, die für mich funktioniert.

Sie könnten auch versuchen, den Dateisystempfad der Bibliothek zu ermitteln (ich bin nicht sicher, ob das einfach ist) und sie mit zu laden:

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

1voto

Markus Lausberg Punkte 12030

Ich glaube, ich habe die Lösung gefunden.

Wir erstellen nur das Plugin, das nicht funktioniert hat, und kopieren es in das Zielverzeichnis der Plattform. Danach starten wir die Anwendung und überprüfen anhand der Protokolldateien, ob die Bibliothek funktioniert hat oder nicht.

Was wir vermissen, ist den Ordner "configurations" löschen . Das neue Plugin wurde nicht entpackt und die Bibliothek war nicht im Konfigurationsverzeichnis vorhanden.

Es tut mir leid und ich danke Ihnen für Ihre Antworten.

EDIT :

Der Konfigurationsordner befindet sich unter

<installation>/eclipse/configuration/

Zumindest alles ohne die Datei löschen

<installation>/eclipse/configuration/config.ini

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X