2009-01-23 6 views
5

créer un plug-in qui inclut la structure de dossier suivant:utilisation Bundle-NativeCode sur Linux ne fonctionne pas

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

le manifeste inclure la commande

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

Les build.properties ressemble

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

Dans la méthode de démarrage de ma classe Activator j'appelle

System.loadLibrary("systemcommand"); 

Lors de l'exécution de la bibliothèque ne se trouve pas et un UnsatisfiedLinkError est lancé.

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

Dois-je définir plus d'attributs dans le plugin? Dois-je décompresser des informations sur la plateforme cible?

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

qu'avez-vous dans votre java.library.path? – dsm

Répondre

1

Je pense que je l'ai trouvé la solution.

Nous construisons uniquement le plugin qui ne fonctionnait pas et le copions dans le répertoire de la plate-forme de destination. Après cela, nous commençons l'application comme wtach les fichiers journaux si la bibliothèque était fière ou non.

Ce qui nous manque, était de supprimer le dossier de configurations. Le nouveau plugin n'était pas unzipp et la bibliothèque n'existait pas dans le répertoire des configurations.

Je suis désolé et merci pour vos réponses.

EDIT:

Le dossier de configuration est placé à

<installation>/eclipse/configuration/ 

au moins supprimer tout sans le fichier

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

Facile à faire une erreur, difficile de voir les conséquences. La même chose m'est arrivée .... –

+0

@Markus Lausberg - Je pense que j'ai le même problème mais je ne comprends pas ce que tu veux dire être "supprimer le dossier des configurations". Où est-ce et comment va-t-on le supprimer? – MrMas

+0

J'ai amélioré ma réponse et j'ai imprimé le chemin du dossier de configuration dans –

0

La lib doit être dans votre système de fichiers (pas dans un fichier d'archive). Ensuite, vous pouvez utiliser l'environnement linux variables LD_LIBRARY_PATH pointant vers le répertoire lib ou définir la propriété java.library.path

+0

Je m'attends à ce que le plugin fasse cela, parce que sur les plateformes Windows cela fonctionne sans chemin de bibliothèque supplémentaire. –

+0

@flolo - vous vous trompez; le framework Eclipse supporte le chargement de bibliothèques natives à partir de bundles de plugins (fichiers JAR). – McDowell

2

Je me demande si la bibliothèque doit être spécifiée sans le préfixe lib? Par exemple,

System.loadLibrary("systemcommand"); 

Puisque c'est ainsi que la bibliothèque serait transmise sur une ligne de liaison gcc.

+0

Merci, mais cela ne fonctionne pas non plus. –

+0

http://mindprod.com/jgloss/runerrormessages.html#UNSATISFIEDLINKERROR suggère que le contraire (ajouter le suffixe .so) est la bonne réponse. –

+0

vous aviez raison !!! la bibliothèque doit charger sans démarrer "lib" –

1

Dans un fragment de plug-in pour linux, j'utilise:

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

Et dans le plugin principal J'utilise:

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

Cela devrait fonctionner au sein d'un plug-in aussi.

Je semble me souvenir d'avoir des problèmes avec les bibliothèques dans un sous-dossier dans le pot, mais je ne sais pas pourquoi ce serait le cas. Je me suis contenté d'avoir les bibliothèques à la racine d'un fragment de plugin, ce qui fonctionne pour moi.

Vous pouvez également essayer d'obtenir le chemin du système de fichiers de la bibliothèque (ne sais pas si c'est facile) et le chargement à l'aide:

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