HelloJNI.java
public class HelloJNI {
// Nativeメソッドの宣言
public native void printHello(String message);
static {
// ライブラリのロード
System.loadLibrary("HelloJNIImpl");
}
public static void main(String[] args) {
new HelloJNI().printHello("Javaから渡されたメッセージ");
}
}
HelloJNIImpl.c
#include <jni.h>
#include "HelloJNI.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj, jstring javaString) {
// Javaの文字列をCの文字列に変換
const char *cString = (*env)->GetStringUTFChars(env, javaString, NULL);
if (cString == NULL) {
return; // メモリ不足などのエラーの場合
}
// Cのprintfで表示
printf("Hello World from JNI! Message from Java: %s\n", cString);
// メモリ解放
(*env)->ReleaseStringUTFChars(env, javaString, cString);
}
① Javaのコンパイル
javac HelloJNI.java
② ヘッダファイルの生成
javah -jni HelloJNI
③ 共有ライブラリのコンパイル
gcc -shared -fPIC -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux HelloJNIImpl.c -o libHelloJNIImpl.so
④ 実行
java -Djava.library.path=. HelloJNI
JNIのプロジェクトをjarにするには
とりあえず同じ階層に全ファイル置いてやる場合
jar cvfm HelloJNI.jar META-INF/MANIFEST.MF .
jar実行
https://www.perplexity.ai/search/jninohurosiekutowojarnisurunih-hV5ETkLaQQ.QQHMiiAfRiA
jarファイルには、jniライブラリ(*.soなど)を含めることができないので、実行時コマンドで、パスを指定する必要がある。
●java.library.pathで指定する場合
java -Djava.library.path=/path/to/native/lib -jar /path/to/your/JniProject.jar
つまり、同じ階層にある場合は
java -Djava.library.path=. -jar HelloJNI.jar
●LD_LIBRARY_PATHをで設定する場合
export LD_LIBRARY_PATH=/path/to/native/lib:$LD_LIBRARY_PATH
java -jar /path/to/your/JniProject.jar
つまり、同じ階層にある場合は
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
java -jar HelloJNI.jar
※ちなみに参考程度ではあるが、上記パスを設定しないでjar実行する場合は、以下ディレクトリにそれぞれのファイルを置く必要がある。
・jarファイルの置き場所:$JAVA_HOME/jre/lib/ext
・jniライブラリ(*.so)の置き場所:$JAVA_HOME/jre/lib/amd64
java -jar HelloJNI.jar
java -jar HelloJNI.jarコマンドを実行するシェルスクリプト
HelloJNI.sh
#!/bin/bash
# JAR ファイルのパスを指定
JAR_FILE="HelloJNI.jar"
# Java コマンドを実行
java -jar "$JAR_FILE"
# 実行が終了したことを表示
echo "HelloJNI.jar の実行が完了しました。"