プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

いまさらJNI 2 - QueryPerformanceCounterを呼び寄せる

 Windows APIでタイマー関連のAPIは、

  1. SetTimer()
  2. マルチメディアタイマーのtimeげとTime()
  3. QueryPerformanceCounter()
  4. 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上のみ動けばいいからいいや。
 本当はこれを使った計測もしたが、いっぱい書いたので、また後日。