2009-01-23 28 views
5

puedo crear un plugin que incluye la siguiente estructura de carpetas:Uso Bundle-NativeCode en Linux no funciona

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

el manifiesto incluyen el comando

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

Los build.properties parece

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

En el método de inicio de mi clase Activator llamo

System.loadLibrary("systemcommand"); 

En tiempo de ejecución no se encuentra la biblioteca y un UnsatisfiedLinkError se lanza.

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

¿Tengo que establecer más atributos en el plugin? ¿Tengo que descomprimir algunas informaciones en la plataforma de destino?

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é es lo que tiene en su java.library.path? – dsm

Respuesta

1

Creo que he encontrado la solución.

Solo creamos el complemento que no estaba funcionando y lo copiamos en el directorio de la plataforma de destino. Después de esto, comenzamos la aplicación como wtach los archivos de registro si la biblioteca fue foud o no.

Lo que extrañamos, fue eliminar la carpeta de configuraciones. El nuevo complemento no era unzipp y la biblioteca no existía en el directorio de configuraciones.

Lo siento y gracias por sus respuestas.

EDIT:

La carpeta de configuración se coloca en

<installation>/eclipse/configuration/ 

Al menos eliminar todo sin el archivo

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

Fácil de cometer errores, consecuencias difíciles de ver. Lo mismo me pasó a mí ... –

+0

@Markus Lausberg: Creo que estoy teniendo el mismo problema, pero no entiendo lo que quiere decir con "eliminar la carpeta de configuraciones". ¿Dónde está y cómo se puede eliminar? – MrMas

+0

Mejoré mi respuesta e imprimí la ruta de la carpeta de configuración en –

0

El lib tiene que estar en su sistema de archivos (no en un archivo histórico). Entonces puede usar la variable de entorno linux LD_LIBRARY_PATH apuntando a la lib o definir la propiedad java.library.path

+0

espero que el plugin me haga esto, porque en plataformas Windows esto funciona sin una ruta de biblioteca adicional. –

+0

@flolo - estás equivocado; El marco de Eclipse admite la carga de bibliotecas nativas de paquetes de complementos (archivos JAR). – McDowell

2

Me pregunto si la librería necesita ser especificada sin el prefijo lib. Por ejemplo,

System.loadLibrary("systemcommand"); 

Dado que así es como se pasará la biblioteca en una línea de enlace gcc.

+0

Gracias, pero esto tampoco está funcionando. –

+0

http://mindprod.com/jgloss/runerrormessages.html#UNSATISFIEDLINKERROR sugiere que lo contrario (agregue el sufijo .so) es la respuesta correcta. –

+0

¡estabas en lo cierto! la biblioteca tiene que cargar sin iniciar "lib" –

1

En un fragmento de plug-in para Linux, yo uso:

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

Y en el complemento principal que utilizo:

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

Esto debería funcionar dentro de un plug-in también.

Parece que recuerdo haber tenido algunos problemas con las bibliotecas en una subcarpeta del contenedor, pero no estoy seguro de por qué sería este el caso. Me limité a tener las bibliotecas en la raíz de un fragmento de complemento, lo cual funciona para mí.

También podría intentar conseguir la ruta del sistema de archivos de la biblioteca (no estoy seguro si eso es fácil) y cargarlo usando:

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