[java][c++] C++の共有ライブラリをJavaから呼び出す

C++を使って作成した共有ライブラリをJavaから簡単に利用する方法を紹介します。JNI(Java Native Interface)を使うよりはるかに簡単です。

用意するものは、jnaerator: http://code.google.com/p/jnaerator/ です。
jnaeratorは、JNA(Java Native Access): https://jna.dev.java.net/を利用して簡単に共有ライブラリへのアクセスを実現しています。

C言語についてのJavaから共有ライブラリへのアクセスの情報はいろいろとあったのですが、C++を使った共有ライブラリの情報が少なかったので、この記事を書きました。

C++のソースを作成.

ここは定番のHelloWorldでしょうか。

 $ vi HelloWorld.h
 #ifndef _HELLO_WORLD_H_
 #define _HELLO_WORLD_H_
 
 class HelloWorld {
 public:
     HelloWorld();
     void call();
 
 private:
     int called;
 };
 #endif
 
 $ vi HelloWorld.cc
 #include <iostream>
 #include "HelloWorld.h"
 
 HelloWorld::HelloWorld() {
     called = 0;
 }

 // このメソッドをJavaから呼び出します。 
 void HelloWorld::call() {
     printf("Hello World, called: %d\n", called++);
 }

コンパイル

 $ g++ -fPIC -c HelloWorld.cc

共有ライブラリを作成

 $ g++ -shared -Wl,-soname,libHelloWorld.so.1 -o libHelloWorld.so.1.0 HelloWorld.o
 $ ln -s libHelloWorld.so.1.0 libHelloWorld.so

jnaeratorを用いてjarを作成.

あらかじめ、jnaeratorをダウンロードしてください。
C++のコードを呼び出せるように-genCPlusPlusオプションを指定します。

 $ java -jar jnaerator-0.9.2.jar -genCPlusPlus HelloWorld.h
 .... HelloWorld.jarが生成される.

共有ライブラリは、生成されたjarの内部に含まれています。

javaのソースを作成.

共有ライブラリを呼び出しているようには見えないところがすばらしいとおもいます。

 $ vi CallHelloWorld.java
 import helloworld.HelloWorld;
 
 class CallHelloWorld {
    public static void main(String[] args) {
        HelloWorld hw = new HelloWorld();
        hw.call();
        hw.call();
    }
 }

コンパイル

 $ javac -cp HelloWorld.jar CallHelloWorld.java

実行.

無事,C++で作成した共有ライブラリが呼び出せました. 本当に便利ですねぇ

 $ java -cp HelloWorld.jar:. CallHelloWorld
 called: 0
 called: 1

いかがでしたでしょうか。