プログラミングメモ

ソフトウェア開発に関する技術メモ。

Visual Studio 2005 (C++) + eclipse 3.5 で JNIを使ったアプリの開発

JNIを使って連携するJavaアプリとWindowsネイティブアプリ(DLL)を開発する場合の、Visual C++eclipseの設定について。

eclipseの設定

以下の設定をする。

  • ネイティブ側でインクルードするヘッダ(.h)ファイルを生成できるように、Antのbuild.xmlを作成
  • Javaアプリの実行時にDLLが読み込まれるように、DLLの検索パスを設定
ヘッダ生成用build.xml

例として、ヘッダ生成先を(プロジェクトのフォルダ)\includeとする。build.xmlの作成場所は任意。


<?xml version="1.0" encoding="UTF-8"?>
<project basedir=".">
    <property name="class.dir" value="${basedir}/bin"/>
    <property name="javah.path" 
        value="C:\Program Files\Java\jdk1.6.0_16\bin\javah"/>
    <property name="header.dir" value="${basedir}/include"/>
    <target name="create.header.files">
        <javah class="mysample.Sample"/>
        <javah class="mysample.Sample2"/>
    </target>
	
    <macrodef name="javah">
        <attribute name="class" />
        <sequential>
            <echo>Creating a header file for @{class}</echo>
        	   <exec executable="${javah.path}">
        	       <arg value="-classpath"/>
        	       <arg value="${class.dir}"/>
        	       <arg value="-d"/>
        	       <arg value="${header.dir}"/>
        	       <arg value="-jni"/>
        	       <arg value="@{class}"/>
        	  </exec>
        </sequential>
    </macrodef>
</project>

javah.pathプロパティには、JDKが提供するjavah.exeのパスを定義。
javahタグのclassアトリビュートには、ヘッダの作成対象となるクラス名を記述。

DLLの検索パス

DLLの検索パスは、後述のVisual Studioのプロジェクトを作成した後で、以下のとおり設定。

  • 一度 [Run] > [Run]で実行させるなどして、configurationを作成する。
  • [Run] > [Run Configurations...]で当該のconfigurationを選択。
  • [Environment]タブで[New...]をクリック
  • 以下のとおり入力してenvironment variableを追加
    • Name: PATH
    • Value: (Visual Studioのプロジェクト作成時に指定したパス)\debug

上記の"debug"の部分は、Visual Studioのプロジェクトでビルドするときのソリューション構成に合わせる。ソリューション構成が「Debug」の場合はdebug, 「Release」の場合はrelease。ソリューション構成はVisual Studioの[ビルド]-[構成マネージャ]で選択。

Visual Studioプロジェクトでは同じ名前のフォルダが別の階層に作成されるため紛らわしい。Visual Studioプロジェクト作成時に、[場所]をc:\foo、[プロジェクト名]をbarとすると、以下のようなフォルダ構成が作成される。

c:\foo
  +-- bar
       +-- bar
       |    +-- Debug
       |    +-- Release
       +-- debug
       +-- release
       

DLLが作成されるのはc:\foo\bar\bar\DebugではなくC:\foo\bar\debugなので、
envitonment variableのPATHにもC:\foo\bar\debugを指定する。

Visual Studioの設定

以下の設定をする。

  • DLL開発用のプロジェクトを作成する。
  • 文字セットはUnicode(1文字2バイト)
  • JDKが提供するjni.hがインクルードできるようにする。
  • JDKが提供するjvm.libがリンクできるようにする。(JNIの「呼び出しAPI」(ネイティブ側からJVMを呼び出すAPI)を使う場合にのみ必要)

具体的な設定内容は以下のとおり。

  • プロジェクトの作成は[ファイル]-[新しいプロジェクト]で[Visual C++]-[Win32]の[Win32プロジェクト]
  • Win32アプリケーションウィザード」が表示されたら[次へ]。アプリケーションの種類は[DLL]。[空のプロジェクト]、[シンボルのエクスポート]はチェックなし。[ATL]、[MFC]は必要に応じて(チェックなしで良い)。
  • ソリューションエクスプローラーのウィンドウで、作成したプロジェクトを右クリックして[プロパティ]
  • 表示されたプロパティページで、上部の[構成]から[すべての構成]を選択
  • [構成プロパティ]-[全般]の[文字セット]は[Unicode文字セットを使用する]
  • [構成プロパティ]-[C/C++]-[全般]の[追加のインクルードディレクトリ]に以下の3つを追加
    • (JDKインストールフォルダ)\include\win32
    • (JDKインストールフォルダ)\include
    • (eclipseのプロジェクトのフォルダ)\include
  • [構成プロパティ]-[リンカ]-[全般]の[追加のライブラリディレクトリ]に以下を指定
    • (JDKインストールフォルダ)\lib
  • [構成プロパティ]-[リンカ]-[入力]の[追加の依存ファイル]に以下を追加
    • jvm.lib (パスはつけない。[追加のライブラリディレクトリ]に指定したディレクトリから検索される。)