0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

helloJNI

Last updated at Posted at 2024-11-16

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

~注意~ ①~③ をちゃんと実行しないと以下エラーになる
image.png

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 の実行が完了しました。"
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?