// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= LinuxでのNetBeans IDEとC/C++プラグインを使用したJNIの開始
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: LinuxでのNetBeans IDEとC/C++プラグインを使用したJNIの開始 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, LinuxでのNetBeans IDEとC/C++プラグインを使用したJNIの開始

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

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

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


=== 内容

image::images/netbeans-stamp-80-74.png[title="このページの内容は、NetBeans IDE 7.4および8.0に適用されます"]

|===
|-  |<<requirements,要件>> 

|-  |<<modules, 環境をチュートリアル用に設定>> 

|-  |<<javaproject,Javaアプリケーション・プロジェクトの設定>> 

|-  |<<c-library, 新規C/C++動的ライブラリ・プロジェクトの設定>> 

|-  |<<running,アプリケーションのビルドと実行>> 

|-  |<<next,次の手順>> 
|===


== 要件

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

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

|NetBeans IDE |link:https://netbeans.org/downloads/index.html[+バージョン7.4または8.0とNetBeans C/C++プラグイン+] 

|Java Developer Kit (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+バージョン7または8+] 

|C/C++コンパイラ、 ``make`` 、 ``gdb``  |link:../../../community/releases/80/cpp-setup-instructions.html[+ C/C++/Fortran向けのNetBeans IDEの構成+] 
|===

必要なソフトウェアのダウンロードとインストールについては、link:../../../community/releases/80/install.html[+NetBeans IDE 8.0のインストール+]およびlink:../../../community/releases/80/cpp-setup-instructions.html[+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アプリケーション」プロジェクト・タイプを選択します。「次」をクリックします。
image::images/jni-new-project-java.png[]
2. 「プロジェクト名」フィールドに「 ``JNIDemoJava`` 」と入力します。
3. 「プロジェクトの場所」はコンピュータ上の任意のディレクトリに変更できますが、ここではユーザー・ディレクトリ内のデフォルトのNetBeansProjectsを使用します。
4. 「メイン・クラスの作成」チェックボックスは選択したままにし、メイン・クラス名を ``jnidemojava.Main`` に変更します。

image::images/jni-new-java-app.png[]
5. 「終了」をクリックします。 

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


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

1. メイン・クラスのソースをエディタで開くには、 ``Main.java`` クラス・ノードを右クリックして「開く」を選択します。
2.  ``main`` メソッドの ``//TODO code application logic here`` 行を次の行で置き換えます。

[source,java]
----

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

[source,java]
----

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

[source,java]
----

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

[source,java]
----

private native void nativePrint();
----

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

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


[source,java]
----

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

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


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

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

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

[source,java]
----

javah -o JNIDemoJava.h -classpath JNIDemoJava/build/classes jnidemojava.Main

----

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

3. NetBeans IDEウィンドウに戻ります。

*サマリー*

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


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

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

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

1. 「ファイル」>「新規プロジェクト」を選択します。「カテゴリ」から「C/C++」を選択します。「プロジェクト」から「C/C++動的ライブラリ」を選択します。「次」をクリックします。
image::images/jni-new-project-c.png[]
2. 「プロジェクト名」フィールドに「 ``JNIDemoCdl`` 」と入力します。
3. 「プロジェクトの場所」フィールドには、Javaアプリケーション・プロジェクトに使用したのと同じ場所である ``NetBeansProjects`` を使用します。この場所はデフォルト値として表示されます。
4. 他のすべてのフィールドはデフォルトを受け入れて、「終了」をクリックします。

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


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

1. 「JNIDemoCdl」プロジェクト・ノードを右クリックし、「プロパティ」を選択します。
2. 「プロパティ」ダイアログ・ボックスで、「ビルド」プロパティの下にある「Cコンパイラ」ノードを選択します。
3. 「ディレクトリとヘッダーを含める」ボタンをクリックし、「ディレクトリとヘッダーを含める」ダイアログ・ボックスで「追加」をクリックします。
4. JDKディレクトリを参照し、 ``include`` サブディレクトリを選択します。
5. 「絶対としてパスを保存」オプションを選択した後、「選択」をクリックして、このディレクトリをプロジェクトの「インクルード・ディレクトリ」に追加します。
6. JDKの ``include/linux`` ディレクトリを同じ方法で追加し、「OK」をクリックします。 
image::images/jni-include-directories.png[]

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

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

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

8. 左パネルの「リンカー」カテゴリをクリックします。
9. 「出力」テキスト・フィールドをクリックして置換します。次の文字列を:

[source,java]
----

${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libJNIDemoCdl.so
----
次の文字列へ:

[source,java]
----

dist/libJNIDemoCdl.so
----
結果の共有オブジェクト・ファイルのパスが簡素化されます。これで、Javaからファイルを参照しやすくなります。
image::images/jni-project-properties-linker.png[]
10. 「OK」をクリックします。定義された設定が保存されます。


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

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

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

image::images/jni-source-files-include-file.png[]


=== メソッドの実装

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

[source,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");

}

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

*サマリー*

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


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

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


=== Javaプロジェクトの構成

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

[source,java]
----

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

----
_full-path-to-NetBeansProjects-dir_を、NetBeansProjectsディレクトリへのパス( ``/home/_username_/NetBeansProjects`` に類似したもの)に置き換えます。
3.  ``Main.java`` ファイルを保存します。


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

1. 「プロジェクト」ウィンドウでJNIDemoJavaアプリケーションを選択します。
2. F6を押すか、ツールバーの「実行」ボタンをクリックして、アプリケーションを実行します。プログラムが正しく実行され、「出力」ウィンドウに次のものと類似した出力が表示されます。
image::images/jni-build-success.png[]


=== サマリー

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


== 次の手順

作業を実際の例に対して確認する場合、netbeans.orgからlink:https://netbeans.org/projects/samples/downloads/download/Samples%252FCPlusPlus%252FJNIDemo.zip[+ソース・コードを含むzipファイルをダウンロード+]できます。

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

* link:quickstart.html[+C/C++プロジェクトのクイック・スタート・チュートリアル+]
* link:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/[+JNI仕様+]
* link:http://en.wikipedia.org/wiki/Java_Native_Interface[+Java Native Interface+]
link:https://netbeans.org/about/contact_form.html?to=7&subject=Feedback:%20Beginning%20JNI%20with%20NetBeans%20IDE%20and%20C/C++%20Plugin%20on%20Linux[+このチュートリアルに関するご意見をお寄せください+]
