3
我试图使这个简单的例子作C类定时器库:接口的Java使用JNI
import java.io.*;
public class Timer {
public static void main(String[] args) {
setTimer(new Runnable() {
public void run() {
System.out.println("tick");
}
},
1000 /* msecs */
);
while (true) ;
}
native public static void setTimer(Runnable r, int msecs);
static {
System.loadLibrary("timer");
}
}
代码很简单。在使用SIGALRM
和setitimer
的JNI/C/Linux中使用程序setTimer
。示例应该每秒打印刻度。
JNI库被编程为:
#include <signal.h>
#include <sys/time.h>
#include "Timer.h"
#include "error.h"
static JNIEnv *genv;
static jobject gobj;
void handler(int s) {
jclass cls = (*genv)->GetObjectClass(genv, gobj);
jmethodID mid = (*genv)->GetMethodID(genv, cls, "run", "()V");
(*genv)->CallVoidMethod(genv, gobj, mid);
}
JNIEXPORT void JNICALL Java_Timer_setTimer
(JNIEnv *env, jclass cls, jobject obj, jint msecs) {
struct sigaction sa;
struct itimerval it;
sa.sa_flags = SA_RESTART;
sigemptyset (&sa.sa_mask);
genv = env;
gobj = obj;
sa.sa_handler = handler;
it.it_interval.tv_sec = msecs/1000;
it.it_interval.tv_usec = (msecs%1000)*1000;
it.it_value = it.it_interval;
if (sigaction (SIGALRM/*PROF*/, &sa, NULL) == -1
|| setitimer (ITIMER_REAL/*PROF*/, &it, NULL) == -1)
SysError("setTimer: sigaction, setitimer: couldn't init timer");
}
我使用的信号链接,以免与JVM的信号干扰库:
LD_LIBRARY_PATH=. LD_PRELOAD=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/libjsig.so java Timer
第一次SIGALRM火灾JMV段错误有消息:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00e9531c, pid=5742, tid=3077924544
#
...
为什么?
感谢小费。有用! – francesc 2012-07-27 17:51:46
不客气。但是,我审查你的问题,没有人得到你接受的答案。如果您觉得它有用,请将答案标记为已接受。 – qrtt1 2012-07-28 01:58:56