package javacodebook.misc.jni_date; import java.util.*; /** * Eine Klasse Date, bei der das Datum gesetzt werden kann */ public abstract class SystemClock { /** * Instanz der Klasse in Abhängig vom Betriebssystem * erzeugen. */ public static SystemClock getInstance() throws UnsupportedOperationException { String os = System.getProperty("os.name"); System.out.println(os); if (os.toLowerCase().startsWith("windows")) return new WinClock(); else throw new UnsupportedOperationException("Unsupported OS!"); } /** * Das Datum neu setzen. */ public void resetClock(java.util.Date date) { Calendar cal = new GregorianCalendar(); cal.setTime(date); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH)+1; int day = cal.get(Calendar.DAY_OF_MONTH); int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); resetClockImpl(year, month, day, hour, minute, second); } /** Die - betriebssystem-abhängige - Methode zum Setzen des Datums */ public abstract void resetClockImpl(int year, int month, int day, int hour, int minute, int second); } --- Neue Klasse --- package javacodebook.misc.jni_date; /** * Die Implementation der Klasse SystemClock * für Windows-Plattformen */ public class WinClock extends SystemClock { static { System.loadLibrary("winclock"); } public native void resetClockImpl(int year, int month, int day, int hour, int minute, int second); } --- Neue Klasse --- package javacodebook.misc.jni_date; import java.util.Date; /** * Benutzung der Klasse SystemClock */ public class Starter { public static void main(String[] args) { // Eine Instanz der Klasse SystemClock holen und // damit die System-Uhrzeit neu setzen SystemClock clock = SystemClock.getInstance(); Date date = new Date(System.currentTimeMillis()+10000*60); clock.resetClock(date); } } --- Generierte Header-Datei --- /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class javacodebook_misc_jni_0005fdate_WinClock */ #ifndef _Included_javacodebook_misc_jni_0005fdate_WinClock #define _Included_javacodebook_misc_jni_0005fdate_WinClock #ifdef __cplusplus extern "C" { #endif /* * Class: javacodebook_misc_jni_0005fdate_WinClock * Method: resetClockImpl * Signature: (IIIIII)V */ JNIEXPORT void JNICALL Java_javacodebook_misc_jni_1date_WinClock_resetClockImpl (JNIEnv *, jobject, jint, jint, jint, jint, jint, jint); #ifdef __cplusplus } #endif #endif --- C-Implementation der Funktionalität --- #include #include JNIEXPORT void JNICALL Java_javacodebook_misc_jni_1date_WinClock_resetClockImpl (JNIEnv *env, jobject obj, jint year, jint month, jint day, jint hour, jint minute, jint second) { SYSTEMTIME tmp; SYSTEMTIME *sysTime; sysTime = &tmp; sysTime->wYear = year; sysTime->wMonth = month; sysTime->wDay = day; sysTime->wHour = hour; sysTime->wMinute = minute; sysTime->wSecond = second; SetSystemTime(sysTime); }