各プラットフォームで、一生懸命、動的ライブラリを作ってきました。
Mac OSXでダイナミックライブラリdylibを作ったり使ったりする方法。
Linuxで共有ライブラリsoを作ったり使ったりする方法。
Windowsでダイナミックリンクライブラリdllを作ったり使ったりする方法。
Visual Studioでダイナミックリンクライブラリdllを作ったり使ったりする方法。
なんのためにこれを作っていたかというと、Javaからネイティブの動的ライブラリを呼び出せることを知り、C言語で実装されたライブラリをJava経由で各プラットフォームで実行しようと思ったためです。
Javaからネイティブライブラリを呼び出せるJNA
JNAは、Java Native Accessの略で、Javaから簡単にネイティブライブラリを呼び出せるようにしたものです。
Android開発をしていた時に、JNI(Java Native Interface)という、ネイティブコードを呼び出す機構を利用していました。その時は、Javaよりもネイティブコードのほうが速度が早いために利用していましたが、JNIはなかなか面倒な手続きが多くて大変です。
そしてJNAは、JNIよりも簡単にネイティブコードを呼び出すことを目的として作られたライブラリです。
MavenでJNAライブラリを導入
Mavenで簡単に導入できます。
net.java.dev.jna
jna
4.0.0
GitHubのリポジトリは下記です。
twall/jna
Javaからネイティブのprintfを呼び出してみる
早速ですが、実際に使ってみます。Wikipediaに載っているコードの一部を実行してみます。
Java Native Access – Wikipedia
public class App {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(Platform.isWindows() ? "msvcrt" : "c", CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
}
}
摩訶不思議ですが、これだけでJavaのSystem.out.printlnではなく、ネイティブのprintfを呼び出したことになるらしいです。実際に実行すると、標準出力にHello Worldが出力されます。
そして、自分で各プラットフォーム向けに作った動的ライブラリも、このJNAから呼び出すことができるはずです。楽しい!
コメント
[…] Javaからネイティブライブラリを簡単に呼び出せるJNA […]