System.currentTimeMillis()
Android 平台中的 java API 调用使用 POSIX apigettimeofday
来获取以毫秒为单位的时间。见这里。
static jlong System_currentTimeMillis(JNIEnv*, jclass) {
timeval now;
gettimeofday(&now, NULL);
jlong when = now.tv_sec * 1000LL + now.tv_usec / 1000;
return when;
}
它假设每次调用gettimeofday
都会成功。我想你的问题可能发生在这里。
最好检查每个 API 调用的返回值,并确定如果发生错误,下一步该做什么。
因此,我建议在 JNI 中使用更可靠的方法,并使用您自己的实现,如下所示。按顺序调用这些 POSIX API,如果gettimeofday
失败,调用clock_gettime
,如果再次失败,调用time
。
struct timeval now;
if (gettimeofday(&now, NULL) != 0) {
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == 0) {
now.tv_sec = ts.tv_sec;
now.tv_usec = ts.tv_nsec / 1000LL;
} else {
now.tv_sec = time(NULL);
now.tv_usec = 0;
}
}
jlong when = now.tv_sec * 1000LL + now.tv_usec / 1000LL;
__android_log_print(ANDROID_LOG_INFO, "TAG", "%lld", when);