JNI完全ガイド
JNI完全ガイド
Section titled “JNI完全ガイド”JNI(Java Native Interface)の仕組みと実践的な使用方法を、実務で使える実装例とベストプラクティスとともに詳しく解説します。
1. JNIとは
Section titled “1. JNIとは”JNIの役割
Section titled “JNIの役割”JNIは、Javaコードからネイティブコード(C/C++)を呼び出すためのインターフェースです。
JNIの用途 ├─ 既存のC/C++ライブラリの利用 ├─ パフォーマンスクリティカルな処理 ├─ システムレベルの機能へのアクセス └─ ハードウェア制御JNIの流れ
Section titled “JNIの流れ”1. Java側でnativeメソッドを宣言2. javahでヘッダーファイルを生成3. C/C++で実装4. 共有ライブラリ(.so/.dll)をビルド5. Javaからロードして使用2. Java側の実装
Section titled “2. Java側の実装”nativeメソッドの宣言
Section titled “nativeメソッドの宣言”public class NativeExample { // ネイティブライブラリのロード static { System.loadLibrary("nativeexample"); }
// nativeメソッドの宣言 public native int add(int a, int b); public native String getMessage(); public native void setMessage(String message);}3. C/C++側の実装
Section titled “3. C/C++側の実装”ヘッダーファイルの生成
Section titled “ヘッダーファイルの生成”# ヘッダーファイルの生成javac NativeExample.javajavah -jni NativeExample
# 生成されるヘッダーファイル: NativeExample.h#include <jni.h>#include "NativeExample.h"
JNIEXPORT jint JNICALLJava_NativeExample_add(JNIEnv *env, jobject obj, jint a, jint b) { return a + b;}
JNIEXPORT jstring JNICALLJava_NativeExample_getMessage(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "Hello from C!");}
JNIEXPORT void JNICALLJava_NativeExample_setMessage(JNIEnv *env, jobject obj, jstring message) { const char *str = (*env)->GetStringUTFChars(env, message, NULL); // 処理 (*env)->ReleaseStringUTFChars(env, message, str);}4. ビルドと実行
Section titled “4. ビルドと実行”共有ライブラリのビルド
Section titled “共有ライブラリのビルド”# Linux/Macgcc -shared -fpic -o libnativeexample.so \ -I$JAVA_HOME/include \ -I$JAVA_HOME/include/linux \ NativeExample.c
# Windowscl /LD NativeExample.c /Fe:nativeexample.dllJavaからの使用
Section titled “Javaからの使用”public class Main { public static void main(String[] args) { NativeExample example = new NativeExample(); int result = example.add(10, 20); System.out.println("Result: " + result); }}JNI完全ガイドのポイント:
- JNI: Javaとネイティブコードの連携
- nativeメソッド: Java側での宣言
- C/C++実装: ネイティブコードの実装
- 共有ライブラリ: .so/.dllのビルド
- ロード: System.loadLibrary()によるロード
適切なJNIの使用により、既存のC/C++ライブラリを活用できます。