【Java】【C】【C++】 JNA [1] ~ 入門編 ~

■ はじめに

https://blogs.yahoo.co.jp/dk521123/33062191.html
で、JNI(Java Native Interface)を使って、JavaからC/C++コードを呼び出した。
しかし、もっと簡単な方法として、JNA (Java Native Access)があるので、纏める

■ JNA (Java Native Access)とは?

 * C/C++コードを、Javaから直接呼び出すことができるライブラリ

公式サイト

https://github.com/java-native-access/jna

補足:JNR(Java Native Runtime)について

 * 試してはいないが、JNR(Java Native Runtime)ってのもあるらしい。
  => 簡単な調査した結果は、以下の関連記事を参照
https://blogs.yahoo.co.jp/dk521123/37771632.html

■ 利点

 * JNIのようにC/C++コードを書かなくてよい

■ ダウンロード先

 * JARファイル(今回は「jna-4.2.2.jar」「jna-platform-4.2.2.jar」)をダウンロードし、
   2つのJARをインポートする
[[https://github.com/java-native-access/jna#download]]

■ サンプル

例1:WindowsAPI を呼び出したサンプル

import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinBase;

public class Main {
  public static void main(String[] args) {
    WinBase.SYSTEMTIME systemtime = new WinBase.SYSTEMTIME();
    // WindowsAPIを呼び出し
    Kernel32.INSTANCE.GetLocalTime(systemtime);
    short year = systemtime.wYear;
    short month = systemtime.wMonth;
    short day = systemtime.wDay;
    System.out.println(
        year + "年" + month + "月" + day + "日");
  }
}

例2:Hello World

 * Linux(Debian) で以下を行う

[1] C/C++のソースを用意する用意する(今回は「hello.c」)
[2] GCCで、SOファイル(For Linux) or DDLファイル(For Windows)を作成する
  (今回は「libhello.so」「libhello.ddl」)
~~~
[For Linux]
gcc -fPIC -shared -o libhello.so hello.c
~~~
[3] Javaプロジェクトを用意し、JNAのJARファイルをインポートする
[4] C/C++用のインターフェイスを用意する(今回は「IHello.java」)
[5] C/C++の関数を呼び出すクラスを用意する(今回は「Main.java」)

hello.c
#include <stdio.h>

void sayHello(){
  printf("Hello!\n");
}

IHello.java
import com.sun.jna.Library;
import com.sun.jna.Native;

public interface IHello extends Library {
  // インスタンス生成
  IHello INSTANCE = (IHello) Native.loadLibrary(
    "~/workspace/SampleCode/etc/libhello.so", IHello.class);

  // 関数へのインターフェース
  void sayHello();
}

Main.java
public class Main {
  public static void main(String[] args) {
    IHello hello = IHello.INSTANCE;
    hello.sayHello();
  }
}

出力結果
Hello!

■ 余談

 * 今度は、「Open JTalk」「NHocr」をJavaから呼び出したい
Open JTalk
http://neu101.seesaa.net/article/267887102.html
http://www.techscore.com/blog/2015/06/29/open-jtalk-japanese-text/


関連記事

JNA (Java Native Access)

基本編
https://blogs.yahoo.co.jp/dk521123/37087661.html
あれこれ編
https://blogs.yahoo.co.jp/dk521123/37089190.html

JNI

Java から C++ のソースを呼び出す
https://blogs.yahoo.co.jp/dk521123/33062191.html
C++ から Java のソースを呼び出す
https://blogs.yahoo.co.jp/dk521123/33067170.html

JNR

入門編
https://blogs.yahoo.co.jp/dk521123/37771632.html

その他

LinuxOCRライブラリ「NHocr」をインストールする ~ Debian編 ~
https://blogs.yahoo.co.jp/dk521123/36629271.html
Linux(仮想環境) で、JDK / Tomcat / Eclipse の環境を構築する ~Debian編~
https://blogs.yahoo.co.jp/dk521123/33854227.html