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マシンである必要があることを定義しています。その句が一致しない場合、ライブラリは無視されると思いましたか?
私が試したもの
- オプションのワイルドカードを削除しています...これは、バンドルが解決されないことを意味します