いまさらJNI 2 - QueryPerformanceCounterを呼び寄せる
- SetTimer()
- マルチメディアタイマーのtimeげとTime()
- QueryPerformanceCounter()
- Direct Musicのなんか忘れた
の4つだそうで、このうち、1と4は使えない/使うのが難しいので無視。
のこりはtimeGetTime()とQueryPerformanceCounter()。timeGetTime()はりソースの取得と破棄があるので、なにも考えずに使えるQueryPerformanceCounter()を実装しよう。
まずは、Java側。こんなのを作ってコンパイル。
public class PerformanceCounter { static { System.loadLibrary("PerformanceCounter"); } public static native long queryPerformanceCounter(); public static native long queryPerformanceFrequency(); }
次はjavahでヘッダーファイルを作って、C側の実装。なぜかCではうまくいかないのでC++で実装する。
#include <windows.h> #include "PerformanceCounter.h" #pragma comment(lib, "kernel32.lib") // extern "C" JNIEXPORT jlong JNICALL Java_PerformanceCounter_queryPerformanceCounter (JNIEnv* pEnv, jclass cl) { LARGE_INTEGER n; ::QueryPerformanceCounter(&n); return n.QuadPart; } // extern "C" JNIEXPORT jlong JNICALL Java_PerformanceCounter_queryPerformanceFrequency (JNIEnv* pEnv, jclass cl) { LARGE_INTEGER n; ::QueryPerformanceFrequency(&n); return n.QuadPart; }
clでコンパイルしてDLLを作成。これで完了です。
関数の戻り値にQuadPartをそのまんま返しているが、本当はエンディアンも考慮する
必要があるかもしれない。でもまぁ、自分のPC上のみ動けばいいからいいや。
本当はこれを使った計測もしたが、いっぱい書いたので、また後日。