2017-09-15 1 views
1

Ich habe ein OSGi-Plugin (Bundle) mit Eclipse File-->New-->Other-->Plug-in Project namens Plugin 1 erstellt. Ich möchte eine native .so-Bibliothek in diesem Plugin verwenden. Ich habe libtest_app_wrap1.so an der Wurzel meines Plugin-Projekts hinzugefügt.UnatisfiedLinkError beim Aufruf der nativen Methode aus dem OSGi-Bundle

meine Projektstruktur sieht aus wie unten

plugin project structure

Und hier die Manifest-Datei

ist
Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: JniTest 
Bundle-SymbolicName: JniTest 
Bundle-Version: 1.0.0.qualifier 
Bundle-Activator: jnitest.Activator 
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 
Import-Package: org.osgi.framework;version="1.3.0" 
Bundle-NativeCode: libtest_app_wrap1.so; osname=linux; processor=amd64 

Und das ist der Code meiner Activator Klasse

package jnitest; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 

public class Activator implements BundleActivator { 

    public Activator() { 
     System.loadLibrary("test_app_wrap1"); 
     System.out.println("Library Loaded Successfully......."); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) 
    */ 
    public void start(BundleContext context) throws Exception { 
     try { 
      test_app.foo(); 

     } catch (Throwable tr) { 
      tr.printStackTrace(); 

     } 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) 
    */ 
    public void stop(BundleContext context) throws Exception { 
     System.out.println("Goodbye World!!"); 
    } 

} 

I erstellen JAR-Datei aus dem Plugin-Projekt mit Eclipse exp oder Feature. Ausgabe-JAR-Datei enthält .so Bibliothek.

Ich bekomme keine Ausnahme oder Fehler, wenn ich die System.loadLibrary("test_app_wrap1"); aufrufen, aber wenn ich die Methode test_app.foo(); aufrufen gibt es mir UnsatisfiedLinkError. test_app.foo() ist eine jni-Methode, die in .so definiert ist.

Ich bekomme keine Ahnung, diesen Fehler zu beheben. Bitte helfen Sie es zu lösen.

[Edit: Ausgangsbündel Inhalt]

Hier ist der Inhalt des Ausgangs jar

jar output

+0

Könnten Sie versuchen 'Bundle-Native: /libtest_app_wrap1.so; osname = Linux; Prozessor = x86-64' (siehe [OSGi-Referenz] (https://www.osgi.org/developer/specifications/reference/))? – howlger

+0

@howlger Ich habe versucht mit 'Bundle-NativeCode: /libtest_app_wrap1.so; osname = Linux; Prozessor = x86-64', aber nicht geholfen. Immer noch die selbe Ausnahme. Ich versuche auf Ubuntu-Maschine. – Raj

+0

In meinem Verständnis, mit 'Bundle-NativeCode: ...' OSGi lädt den systemeigenen Code anstelle von 'System.loadLibrary (...);' in Ihrem Java-Code. Könnten Sie es ohne 'System.loadLibrary (...);' testen und ohne einen bundle activator (vielleicht 'test_app.foo();' kann nur aufgerufen werden, nachdem 'start() 'von activator beendet wurde). – howlger

Antwort

-1
über

das Glas zum Projekt hinzu: Ausbau-> Einstellungen-> Libraries> hinzufügen jar In das Glas zum Klassenpfad über plugin.xml-> Runtime-> ClassPath section-> Add

oder Verwenden Wege folgende hinzufügen jar

java -Djava.library.path 

und überprüfen, indem Sie folgende:

System.getProperty("java.library.path") 
+0

Es gibt kein Jar, das dem Plugin-Projekt hinzugefügt werden kann. Ich möchte nur die '.so' Bibliothek verwenden. Bitte lassen Sie mich wissen, welches Glas ich hinzufügen muss. – Raj

+0

https://stackoverflow.com/questions/36780017/unsatisfiedlinkerror-in-exported-eclipse-executable-jar-file –

+0

Ich bekomme keine Ausnahme, wenn ich 'System.loadLibrary (" test_app_wrap1 ");'. Ich erhalte nur eine Ausnahme, wenn ich versuche, die in der Bibliothek definierte Methode aufzurufen. – Raj

Verwandte Themen