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
Und hier die Manifest-Datei
istManifest-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
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
@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
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