java.loadLibrary を使用する
Java のロードライブラリメソッドは DLL、SO などの動的リンクライブラリファイルを読み込むために使います。以下はロードライブラリを使ったステップです。
- ライブラリローダーの例のようなJavaクラスを作成する。
- ロードダイナミックリンクライブラリ関数を宣言する場合は、本記事のように宣言します:
public class LibraryLoader {
public static native void loadLibrary(String libraryName);
}
- System.loadLibrary()
public class Main {
public static void main(String[] args) {
System.loadLibrary("myLibrary");
}
}
- javacコマンドでJavaクラスをコンパイルする: javac LibraryLoader.java
- javahコマンドで、C/C++のヘッダファイルを作成する:javah -jni LibraryLoader
- ネイティブメソッドの実装として、生成されたヘッダーファイルに動的リンクライブラリのロードを行います。例えば、前出の例では、生成されたヘッダーファイルに以下のコードを追加します。
#include <jni.h>
#include <stdio.h>
#include "LibraryLoader.h"
JNIEXPORT void JNICALL Java_LibraryLoader_loadLibrary(JNIEnv *env, jclass cls, jstring libraryName) {
const char *name = (*env)->GetStringUTFChars(env, libraryName, NULL);
// 加载动态链接库
if (name != NULL) {
printf("Loading library: %s\n", name);
// 加载动态链接库的代码
(*env)->ReleaseStringUTFChars(env, libraryName, name);
}
}
- C/C++ コンパイラで生成したヘッダファイルと実装ファイルをコンパイルして、ダイナミックリンクライブラリファイルを生成します。たとえば、上記の例に対応するダイナミックリンクライブラリファイルをコンパイルするには、次のコマンドを使用できます。
- ウィンドウズ
gcc -shared -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" LibraryLoader.c -o myLibrary.dll
- リナックス:
gcc -shared -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" LibraryLoader.c -o libmyLibrary.so
- ロードライブラリ