のOSGiバンドルからネイティブメソッドの呼び出し中に、私はこのプラグインでネイティブ.so
ライブラリを使用するプラグイン1. と呼ばれる日食File-->New-->Other-->Plug-in Project
を使用して1つのOSGiプラグイン(バンドル)を作成しました。私はプラグインプロジェクトのルートにlibtest_app_wrap1.so
を追加しました。ないUnsatisfiedLinkError
そして、ここの下にマニフェストファイルは
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
であり、これは私が作成し、私のアクティベータークラスのコード
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!!");
}
}
であるように私のプロジェクトの構造が見えますeclipse expを使ってプラグインプロジェクトからjarファイルを作成するオルト機能。出力jarファイルには.so
ライブラリが含まれています。
私はSystem.loadLibrary("test_app_wrap1");
を呼び出すときに例外やエラーは発生しませんが、test_app.foo();
というメソッドを呼び出すとUnsatisfiedLinkError
と表示されます。 test_app.foo()
は、.so
で定義されているjniメソッドです。
このエラーを解決する手がかりはありません。それが解決するのを助けてください。
[編集:出力バンドル内容]
ここで出力ジャー
あなたは 'バンドル-NativeCodeを試みることができる:/libtest_app_wrap1.so。 osname = Linux; processor = x86-64'([OSGiリファレンス](https://www.osgi.org/developer/specifications/reference/)参照)? – howlger
@howlger私は 'Bundle-NativeCode:/libtest_app_wrap1.so;を試しました。 osname = Linux; processor = x86-64'しかし助けにはならなかった。それと同じ例外。私はubuntuマシンで試しています。 – Raj
私の理解では、 'Bundle-NativeCode:... 'では、OSGiはあなたのJavaコードで' System.loadLibrary(...); 'の代わりにネイティブコードを読み込みます。 'System.loadLibrary(...);'とバンドルアクチベータなしで( 'test_app.foo();'はアクチベータの 'start()'が終了した後でなければ呼び出せません) – howlger