Pregunta

Creo un complemento que incluye la siguiente estructura de carpetas:

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

El manifiesto incluye 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: .

El build.properties se 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 se arroja un UnsatisfiedLinkError .

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

¿Tengo que establecer más atributos en el complemento? ¿Tengo que descomprimir alguna información 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
¿Fue útil?

Solución 3

Creo que encontré la solución.

Solo compilamos el complemento que no funcionaba y lo copiamos al directorio de la plataforma de destino. Después de esto, comenzamos la aplicación como wtach los archivos de registro si la biblioteca era foud o no.

Lo que echamos de menos fue eliminar la carpeta de configuraciones . El nuevo complemento no se descomprimió y la biblioteca no existía en el directorio de configuraciones.

Lo siento y gracias por sus respuestas.

EDITAR:

La carpeta de configuración se coloca en

<installation>/eclipse/configuration/

Al menos elimine todo sin el archivo

<installation>/eclipse/configuration/config.ini

Otros consejos

Me pregunto si la biblioteca debe especificarse sin el prefijo lib. Por ejemplo,

System.loadLibrary("systemcommand");

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

En un fragmento de complemento para Linux, uso:

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

Y en el complemento principal que uso:

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

Esto también debería funcionar dentro de un complemento.

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

También puede intentar obtener la ruta del sistema de archivos de la biblioteca (no estoy seguro si eso es fácil) y cargarla usando:

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

La lib debe estar en su sistema de archivos (no en un archivo). Luego puede usar la variable de entorno de Linux LD_LIBRARY_PATH apuntando a la biblioteca o definir la propiedad java.library.path

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top