LinuxでのNetBeans IDEとC/C++プラグインを使用したJNIの開始

This tutorial needs a review. You can open a JIRA issue, or edit it in GitHub following these contribution guidelines.

2014年3月 [リビジョン番号: V8.0-1]

このチュートリアルでは、Cプログラミング言語で記述されたJavaTM Native Interface (JNI)コードを使用する、単純なアプリケーションの作成について説明します。

このチュートリアルはLinuxに固有です。

要件

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン

NetBeans IDE

バージョン7.4または8.0とNetBeans C/C+プラグイン+

Java Developer Kit (JDK)

バージョン7または8

C/C++コンパイラ、 makegdb

+ C/C+/Fortran向けのNetBeans IDEの構成

必要なソフトウェアのダウンロードとインストールについては、NetBeans IDE 8.0のインストールおよびC/C+/Fortran向けのNetBeans IDEの構成+を参照してください。

環境をチュートリアル用に設定

このチュートリアルにはJavaモジュールとC/Cモジュールの両方が必要です。NetBeans IDE C/Cバンドルをすでにダウンロードしている場合、追加のJavaモジュールを個別にダウンロードできます。

JavaおよびC/Cモジュールがあるかどうか判別するには、「ファイル」>「新規プロジェクト」を選択します。プロジェクト・カテゴリにJavaとC/Cの両方が含まれています。

存在しないJavaおよびC/C++モジュールをダウンロードするには:

  1. NetBeans IDEで、「ツール」>「プラグイン」を選択します。

  2. 「使用可能なプラグイン」タブで、どちらがIDEに存在しないかに応じて、JavaまたはC/C++のチェックボックスを選択します。プラグインがすでに存在する場合、プラグインは「インストール済」タブに表示されます。

  3. 「インストール」をクリックします。

  4. 「NetBeans IDEのインストーラ」ダイアログ・ボックスで「次」をクリックし、ライセンス条項のチェックボックスに同意し、「インストール」をクリックします。

  5. インストールが完了したら「終了」をクリックします。

Javaアプリケーション・プロジェクトの設定

このプログラムには、JavaプロジェクトおよびCプロジェクトが必要です。この項では、開発するJNIアプリケーション用のJavaプロジェクトを作成および構成します。新規Javaアプリケーション・プロジェクトを作成し、そのメイン・クラスを初期化し、ネイティブ・メソッドをこのクラスに追加します。

  1. 「ファイル」>「新規プロジェクト」を選択します。「Java」カテゴリおよび「Javaアプリケーション」プロジェクト・タイプを選択します。「次」をクリックします。

jni new project java
  1. 「プロジェクト名」フィールドに「 JNIDemoJava 」と入力します。

  1. 「プロジェクトの場所」はコンピュータ上の任意のディレクトリに変更できますが、ここではユーザー・ディレクトリ内のデフォルトのNetBeansProjectsを使用します。

  1. 「メイン・クラスの作成」チェックボックスは選択したままにし、メイン・クラス名を jnidemojava.Main に変更します。

jni new java app
  1. 「終了」をクリックします。

IDEによって、 NetBeansProjects/JNIDemoJava プロジェクト・フォルダが作成されます。

メイン・クラスのソースの編集

  1. メイン・クラスのソースをエディタで開くには、 Main.java クラス・ノードを右クリックして「開く」を選択します。

  2. main メソッドの //TODO code application logic here 行を次の行で置き換えます。

new Main().nativePrint();
  1. エラーおよび電球を表示するインジケータが左マージンに示されるのがわかります。インジケータをクリックすると、メソッド nativePrint を作成することを求めるショートカットが表示されます。

  1. このショートカットをクリックすると、IDEは次のコードを挿入します。

private void nativePrint() {
      throw new UnsupportedOperationException("Not supported yet");
   }
  1. 次の行を削除します。

throw new UnsupportedOperationException("Not supported yet");
  1. native キーワードをメソッド署名に挿入して nativePrint() メソッドを変更し、次のようになるようにします。

private native void nativePrint();
``native`` キーワードは、メソッドが、外部ネイティブ・ライブラリにある実装を持つことを示します。ただし、実行時は、ライブラリの場所は明確ではありません。

新しいmainメソッドは次のようになります。

public static void main(String[] args) {
       new Main().nativePrint();
   }

   private native void nativePrint();
}
  1. プロジェクト名を右クリックし、「消去してビルド」を選択します。プロジェクトは正常にビルドされます。

ネイティブ・ライブラリ・ヘッダー・ファイルの作成

この項では、JavaクラスからCヘッダーを作成するJavaツールである javah を使用します。

  1. ターミナル・ウィンドウで、 NetBeansProjects ディレクトリに移動します。

  2. 次を入力します。

javah -o JNIDemoJava.h -classpath JNIDemoJava/build/classes jnidemojava.Main
``JNIDemoJava.h``  Cヘッダー・ファイルがNetBeansProjectsディレクトリに生成されます。このファイルは ``nativePrint()`` メソッドのネイティブ実装のための正しい関数宣言を提供するために必要です。後でこのアプリケーションのC部分を作成するとき、これが必要になります。
  1. NetBeans IDEウィンドウに戻ります。

サマリー

この課題では、新規Javaアプリケーション・プロジェクトを作成し、その場所を指定し、プロジェクトのメイン・クラスのパッケージおよび名前を定義しました。また、メイン・クラスに新規メソッドを追加し、ネイティブ実装を持つメソッドとして新規メソッドをマークしました。最後のステップとして、後でネイティブ・ライブラリのコンパイルで必要になるCヘッダー・ファイルを作成しました。

新規C/C++動的ライブラリ・プロジェクトの設定

この項では、アプリケーションのネイティブ部分を作成する方法を示します。C++動的ライブラリ・プロジェクトを作成し、JNIコードをビルドできるようこれを構成します。

プロジェクトを設定した後、アプリケーションのJava部分で以前宣言したネイティブ・メソッドのための実装を作成します。

  1. 「ファイル」>「新規プロジェクト」を選択します。「カテゴリ」から「C/C」を選択します。「プロジェクト」から「C/C動的ライブラリ」を選択します。「次」をクリックします。

jni new project c
  1. 「プロジェクト名」フィールドに「 JNIDemoCdl 」と入力します。

  1. 「プロジェクトの場所」フィールドには、Javaアプリケーション・プロジェクトに使用したのと同じ場所である NetBeansProjects を使用します。この場所はデフォルト値として表示されます。

  1. 他のすべてのフィールドはデフォルトを受け入れて、「終了」をクリックします。

IDEは NetBeansProjects/JNIDemoCdl プロジェクト・フォルダを作成します。

プロジェクト・プロパティの設定

  1. 「JNIDemoCdl」プロジェクト・ノードを右クリックし、「プロパティ」を選択します。

  2. 「プロパティ」ダイアログ・ボックスで、「ビルド」プロパティの下にある「Cコンパイラ」ノードを選択します。

  3. 「ディレクトリとヘッダーを含める」ボタンをクリックし、「ディレクトリとヘッダーを含める」ダイアログ・ボックスで「追加」をクリックします。

  4. JDKディレクトリを参照し、 include サブディレクトリを選択します。

  5. 「絶対としてパスを保存」オプションを選択した後、「選択」をクリックして、このディレクトリをプロジェクトの「インクルード・ディレクトリ」に追加します。

  6. JDKの include/linux ディレクトリを同じ方法で追加し、「OK」をクリックします。

jni include directories

これらの設定は、CコードからJava jni.h ライブラリへの参照を有効にするために必要です。

  1. 「Cコンパイラ」オプションの「コンパイル行」領域を見つけます。「追加のオプション」プロパティのテキスト・フィールド内をクリックし、 -shared -m32 と入力します。jni project properties cmd options

    ``-shared`` オプションは、動的ライブラリを生成することをコンパイラに指定します。
    ``-m32`` オプションは、32ビット・バイナリを作成することをコンパイラに指定します。64ビット・システムのデフォルトでは、コンパイルされたバイナリは64ビットで、このことは32ビットJDKで多くの問題を引き起こします。
  1. 左パネルの「リンカー」カテゴリをクリックします。

  1. 「出力」テキスト・フィールドをクリックして置換します。次の文字列を:

${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libJNIDemoCdl.so

次の文字列へ:

dist/libJNIDemoCdl.so

結果の共有オブジェクト・ファイルのパスが簡素化されます。これで、Javaからファイルを参照しやすくなります。

jni project properties linker
  1. 「OK」をクリックします。定義された設定が保存されます。

ヘッダー・ファイルの追加

  1. ターミナル・ウィンドウに移動し、以前生成した JNIDemoJava.h ヘッダー・ファイルを NetBeansProjects ディレクトリからC/C++ライブラリのプロジェクト・ディレクトリである NetBeansProjects/JNIDemoCdl に移動します。 2. 「プロジェクト」ウィンドウで、 JNIDemoCdl プロジェクトの「ヘッダー・ファイル」ノードを右クリックし、「既存の項目の追加」を選択します。 NetBeansProjects/JNIDemoCdl ディレクトリにナビゲートして JNIDemoJava.h ファイルを選択し、「選択」をクリックします。

    ``JNIDemoJava.h`` ファイルが「ヘッダー・ファイル」の下に表示されます。
jni source files include file

メソッドの実装

  1. JNIDemoCdl 」プロジェクトの「ソース・ファイル」ノードを右クリックし、「新規」>「Cソース・ファイル」を選択します。「ファイル名」フィールドに「 JNIDemo 」と入力し、「終了」をクリックします。エディタは JNIDemo.c ファイルを開きます。

  2. 次のコードを入力して、 JNIDemo.c ファイルを編集します。

#include <jni.h>
#include <stdio.h>
#include "JNIDemoJava.h"

JNIEXPORT void JNICALL Java_jnidemojava_Main_nativePrint
        (JNIEnv *env, jobject obj)
{

    printf("\nHello World from C\n");

}
  1. JNIDemo.c ファイルを保存します。

  1. JNIDemoCdl 」プロジェクト・ノードを右クリックし、「ビルド」を選択します。「出力」ウィンドウに BUILD SUCCESSFUL (total time 171ms) (または類似する文)が表示されます。

サマリー

この課題では、新規C/C++動的ライブラリを作成し、その場所を指定し、JavaメソッドのJNI実装をビルドできるようにこれを構成しました。Javaアプリケーション内で宣言したネイティブ・メソッド用の生成済ヘッダー・ファイルを追加し、これを実装しました。

アプリケーションのビルドと実行

この課題では、アプリケーションのJava部分に対して、いくつかの最終的な変更を実行します。これらの変更は、前の課題でコンパイルしたネイティブ・ライブラリをJava部分が正しくロードするために必要です。この後、結果のアプリケーションをコンパイルおよび実行します。

Javaプロジェクトの構成

  1. エディタで Main.java ファイルを開きます。

  2. 前の課題で短縮した出力ファイルのパスを使用して、 public class Main 行の後にC++動的ライブラリの次の初期化コードを追加します。

static {
        System.load("_full-path-to-NetBeansProjects-dir_/JNIDemoCdl/dist/libJNIDemoCdl.so");
       }

full-path-to-NetBeansProjects-dir_を、NetBeansProjectsディレクトリへのパス( /home/_username/NetBeansProjects に類似したもの)に置き換えます。

  1. Main.java ファイルを保存します。

JNIDemoJavaアプリケーションの実行

  1. 「プロジェクト」ウィンドウでJNIDemoJavaアプリケーションを選択します。

  2. F6を押すか、ツールバーの「実行」ボタンをクリックして、アプリケーションを実行します。プログラムが正しく実行され、「出力」ウィンドウに次のものと類似した出力が表示されます。

jni build success

サマリー

この課題では、いくつかの最終的な構成手順を実行し、アプリケーションを実行して、ネイティブ・メソッドの実装が、ネイティブCライブラリからのものであることを確認しました。

次の手順

作業を実際の例に対して確認する場合、netbeans.orgからソース・コードを含むzipファイルをダウンロードできます。

次のドキュメントを使用して詳細情報を入手できます。