「JavaからJNIでC言語プログラムを呼び出す」の版間の差分
提供: Java入門
(ページの作成:「JavaからC言語のプログラムを呼び出せます。JNI(Java Native Interface, Javaネイティブインターフェース)は、C言語やC++言語などで書か...」) |
(相違点なし)
|
2015年3月21日 (土) 16:38時点における最新版
JavaからC言語のプログラムを呼び出せます。JNI(Java Native Interface, Javaネイティブインターフェース)は、C言語やC++言語などで書かれたCPUで実行できるネイティブコードを連携するためのインターフェースです。
読み方
- JNI
- じぇーえぬあい
- Java Native Interface
- じゃば ねいてぃぶ いんたーふぇーす
概要
JNIを利用するメリットは以下の通りです。
- ネイテイブコードは実行が速い
- 既存のコードを再利用できる
すでにC言語やC++言語で記述されたプログラムがある場合、それらのコードを再利用したほうがメンテナンスの負担を減らせます。CやC++のプログラムは、ほかのプログラムのエクステンション(モジュール)として再利用しやすいため、広く共通で使われるコードは、C/C++で作成したほうが便利です。
JNI以外にSWIGというツールがありますが、ここでは、JNIを扱います。
HelloJNI
ソースコード HelloJNI.java
/* * HelloJNI.java * Copyright (C) 2015 kaoru <kaoru@bsd> */ public class HelloJNI { static { System.loadLibrary("hello"); } public native void hello(); public static void main(String[] args) { HelloJNI hello = new HelloJNI(); hello.hello(); } }
ソースコード hello.c
/* * hello.c * Copyright (C) 2015 kaoru <kaoru@bsd> */ #include "HelloJNI.h" JNIEXPORT void JNICALL Java_HelloJNI_hello(JNIEnv *env, jobject obj) { (void) puts ("Hello World"); }
コンパイル
javah コマンドが HelloJNI.h を作成します。
$ javac HelloJNI.java $ javah HelloJNI
コンパイル
コンパイル環境に合わせて、パスを設定してください。環境変数にJAVA_HOMEが設定されていない場合は、OpenJDK のインストールされているパスを指定します。
FreeBSD の場合は、以下の通りです。
cc -fPIC -shared -I$JAVA_HOME/include -I$JAVA_HOME/include/freebsd/ \ hello.c -o libhello.o
Linux の場合は、以下の通りです。
cc -fPIC -shared -I$JAVA_HOME/include -I$JAVA_HOME/include/linux/ \ hello.c -o libhello.o
実行例
プログラムを実行するときに、ライブラリのパスを指定する必要があります。
$ java -Djava.library.path=. HelloJNI Hello World