最后,我发现JNI是解决我问题的最佳方法.作为参考,我发布代码并为其构建说明(基于维基百科的example):
负责与C代码(GetThreadID.java)接口的Java类:
public class GetThreadID {
public static native int get_tid();
static {
System.loadLibrary("GetThreadID");
}
}
C文件负责获取线程ID(GetThread.c):
#include
#include
#include "GetThreadID.h"
JNIEXPORT jint JNICALL
Java_GetThreadID_get_1tid(JNIEnv *env, jobject obj) {
jint tid = syscall(__NR_gettid);
return tid;
}
如何使用GetThreadID类的示例:
class Main {
public static void main(String[] args) {
int tid = GetThreadID.get_tid();
System.out.println("TID=" + tid);
}
}
最后,构建指令(javah自动生成GetThreadID.h):
JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:bin/javac::")
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
javac GetThreadID.java
javah GetThreadID
gcc -I${JAVA_HOME}/include -fPIC -shared GetThreadID.c -o libGetThreadID.so
javac Main.java
java Main