JavaからJNIでC言語プログラムを呼び出す

提供: Java入門
2015年3月21日 (土) 16:38時点におけるDaemon (トーク | 投稿記録)による版 (ページの作成:「JavaからC言語のプログラムを呼び出せます。JNI(Java Native Interface, Javaネイティブインターフェース)は、C言語やC++言語などで書か...」)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

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

関連項目




スポンサーリンク