NetBeansでネイティブライブラリ

開発環境としてNetBeans6.8を使ってみてる。

さて、実行時にネイティブライブラリを使用する場合、
実行時引数に-Djava.library.pathを設定すればよいらしい。
けど、プラットフォームごとに毎回設定し直すのは面倒なので何とかしたい。
Eclipseだと確かGUIで設定できたと思うんだけど、
NetBeansでは見当たらなかった。


そこで、実行時にAntタスクでうまく設定できないだろうかという試み。

ディレクトリ構成

プラットフォームごとのライブラリをまとめておく。
この例はプロジェクトディレクトリ直下のnative_libsディレクトリにまとめたものとする。

Project_root
 |-- build.xml
 |-- native_libs
 |   |-- foo-linux-i586
 |   |   `- libfoo.so
 |   |-- foo-macosx-universal
 |   |   `- libfoo.jnilib
 |   `-- foo-windows-i586
 |       `- foo.dll
 |-- nbproject
 |   |-- build-impl.xml
 |   |-- project.properties
 |   `-- project.xml
 `-- src

build.xmlの編集

初期化時にプラットフォームごとのライブラリへのパスを設定する。
この例ではnatives.platformにプラットフォームを、
natives.libpath.fooにプラットフォームごとのライブラリパスを設定してる。

 <target name="-pre-init">
     <condition property="natives.platform" value="linux-i586">
         <os name="Linux" arch="i386"/>
     </condition>
     <condition property="natives.platform" value="macosx-universal">
         <os name="Mac OS X"/>
     </condition>
     <condition property="natives.platform" value="windows-i586">
         <os name="windows" arch="i386"/>
     </condition>
     <fail message="unknown platform!" unless="natives.platform"/>
     <echo message="platform: ${natives.platform}"/>
     <property name="natives.libpath.foo" location="./native_libs/foo-${natives.platform}/lib"/>
 </target>

conditionタスクに関してはAntのマニュアルを参照。

jar生成後、distディレクトリにネイティブライブラリをコピーするように設定

 <target name="-post-jar">
     <copy todir="${dist.dir}">
         <fileset dir="${natives.libpath.foo}"/>
     </copy>
 </target>

project.propertiesファイルの編集

以下の内容を追加。

 run.jvmargs="-Djava.library.path=${natives.libpath.foo}"

プロパティの設定

プロジェクトのプロパティで、「保存時にコンパイル」の無効にしておく。
これを有効にしている場合、プログラムの実行時にAntタスクが実行されないため。
参考: http://wiki.netbeans.org/FaqCompileOnSaveJa

実行

あとは普通にプロジェクトを実行すれば良い。
ただし、デバッグも問題なく動作するが、
プロファイラを使用した場合はうまく動かないみたいだ。
この件は今のところ未解決。