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のマニュアルを参照。
- http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/CoreTasks/condition.html
- http://ant.apache.org/manual/Tasks/condition.html
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
実行
あとは普通にプロジェクトを実行すれば良い。
ただし、デバッグも問題なく動作するが、
プロファイラを使用した場合はうまく動かないみたいだ。
この件は今のところ未解決。