6

JNotifyプロジェクトを使用してファイルシステムイベントをリッスンしています。これは、OS:プロセッサアーキテクチャごとに1つのネイティブライブラリに依存します。たとえば、Windows x86用に1つのライブラリ、x86-64用に1つのライブラリなどがあります。

モノリシックバンドル

元々、JNotifyJavaクラスとネイティブコードの両方を含むバンドルが1つありました。ネイティブコードは、Bundle-NativeCodeで次のように宣言されています。

(読みやすくするために、これらをbndスタイルでフォーマットしました...明らかに実際のMANIFEST.MFファイルは適切に形成されています)。

Bundle-NativeCode: jnotify_64bit.dll;osname=Win32;osname="Windows NT (unknown)";osname = WindowsXP;osname = Windows2000;osname = Windows2003;osname = WindowsVista;osname = Windows7;osname = WindowsServer2008;osname= Windows8;osname = WindowsServer2012;processor = x86-64,\
 jnotify.dll;osname=Win32;osname="Windows NT (unknown)";osname = WindowsXP;osname = Windows2000;osname = Windows2003;osname = WindowsVista;osname = Windows7;osname = WindowsServer2008;osname = Windows8;osname = WindowsServer2012;processor = x86,\
 libjnotify.so;osname = Linux;processor = x86,\
 libjnotify64.so;osname = Linux;processor = x86-64,\
 libjnotify.dylib;osname = Mac OSX;processor = x86;processor = x86-64,\
 *

これはうまくいきました。

フラグメントに移動

ライブラリを別々のフラグメントバンドルに移動して、関心のあるアーキテクチャのフラグメントを提供できるようにすると、「いい」と思いました。Linuxを例にとると、2つのバンドルに分割します。

Linux32ビット

Include-Resource: lib/libjnotify.so
Bundle-NativeCode: libjnotify.so;osname = Linux;processor = x86,\
    *
Fragment-Host: net.contentobjects.jnotify
Bundle-Version: 0.94.0

Linux64ビット

Include-Resource: lib/libjnotify.so
Bundle-NativeCode: libjnotify.so;osname = Linux;processor = x86-64,\
    *
Fragment-Host: net.contentobjects.jnotify
Bundle-Version: 0.94.0

これらのバンドルは異なるソースから構築されていることに注意してください。libjnotify.soファイル名は同じですが、異なるEclipseプロジェクトの異なるファイルです。JNotifyを使用するには、これらが同じである必要があります。

同じファイル名がホストバンドルに提供されることに注意してください。この場合、ファイル名はlibjnotify.soです。

これらを64ビットマシンで実行し、64ビットバンドルを32ビットバンドルのにロードすると、機能します。

ただし、32ビットバンドルが最初にロードされると、次のようになります。

Couldn't initialise JNotify: java.lang.UnsatisfiedLinkError: /blah/generated/fw/bundle46/version0.0/net.contentobjects.jnotify.linux.x86-0.94.0.jar-lib/0/libjnotify.so: /blah/generated/fw/bundle46/version0.0/net.contentobjects.jnotify.linux.x86-0.94.0.jar-lib/0/libjnotify.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch) (JnotifyFileSystemObserver.java:53, thread platformExecutor)

明らかに、32ビットライブラリがロードされています。しかし、なぜ?My Bundle-NativeCodeは、32ビットバンドルのバージョンを使用するには、ホストが32ビットLinuxマシンである必要があることを定義しています。その句が一致しない場合、ライブラリは無視されると思いましたか?

私が試したもの

  • オプションのワイルドカードを削除しています...これは、バンドルが解決されないことを意味します
4

3 に答える 3

3

フラグメントは同じリソース名前空間を占有するため、アクセスできる .so ファイルは 1 つだけです。フラグメントを 1 つだけデプロイすることも、別のディレクトリに配置することもできます。

 Fragment 32-bit:
 Include-Resource: x32/libjnotify.so=lib/libjnotify.so

 Fragment 64-bit:
 Include-Resource: x64/libjnotify.so=lib/libjnotify.so

また、Bundle-NativeCode ヘッダーをホスト バンドルに配置し、適切なディレクトリを参照する必要があると思います。このヘッダーはホストにマージされていないと思うからです。

于 2012-10-17T06:09:18.047 に答える
0

Equinoxに制限されることを気にしない場合は、プラットフォームごとに 1 つのフラグメント ソリューションを使用できますEclipse-PlatformFilter。この場合、いつでもネイティブ コードを含む 1 つのフラグメントのみを解決してインストールできるため、名前空間の競合を回避できます。

于 2014-09-08T14:10:27.960 に答える
0

実行している Eclipse/OSGi コンテナーのバージョンを確認してください。起動しようとしているコンテナの OS が 32 ビット システムに設定されていると思われます。

于 2012-10-16T21:06:48.117 に答える