2023/12/7

java code : wait system signal in jni

就是... java call jni,jni wait system signal,作到 C program 類似 的 wait signal 功能。
java code :
$ cat SignalExample.java 
public class SignalExample {
    static {
        System.loadLibrary("SignalLibrary"); // Load the native library
    }

    // Native method declaration
    public native void waitForSignal();

    public static void main(String[] args) {
	System.out.println("Start..");
        SignalExample signalExample = new SignalExample();
        signalExample.waitForSignal();
	System.out.println("End");
    }
}
jni code:
$ cat SignalLibrary.c 
#include <jni.h>
#include <stdio.h>
#include <signal.h>

// Global variable to indicate whether the signal has been received
volatile sig_atomic_t signalReceived = 0;

// Signal handler function
void handleSignal(int signo) {
    signalReceived = 1;
}

// Native method implementation
JNIEXPORT void JNICALL Java_SignalExample_waitForSignal(JNIEnv *env, jobject obj) {
    // Set up signal handler
    signal(SIGUSR1, handleSignal);

    // Wait for the signal
    while (!signalReceived) {
        // Perform other work or sleep if needed
        // ...
    }

    printf("Signal received!\n");
}

build code..
先build jni..

先 export 我的 jdk 位置
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
compile jni C:
$ gcc -shared -o libSignalLibrary.so -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux SignalLibrary.c
然後 compile java
javac SignalExample.java

TEST run:
run 的時候要告訴他 so 在哪裡...
$ java -Djava.library.path=/home/charles-chang/ SignalExample 
Start..
Signal received!
End
在Start.. 的時候就停了,開啟另一個 terminal 找這個process 的 PID,下signal:
charles+ 3994772 98.5  0.1 11275340 36368 pts/2  Sl+  10:14   0:03 java -Djava.library.path=/home/charles-chang/ SignalExample
...
$ kill -SIGUSR1 3994772
就會出現 "Signal received, End",然後結束。
如果不送SIGUSER1,改用 Ctrl-C,就會...
$ java -Djava.library.path=/home/charles-chang/ SignalExample 
Start..
^C
不會有 Signal received 和 End,會直接結束。


  • 這個 example 是 chatgpt 寫的

沒有留言:

張貼留言