プログラマメモ2 - programmer no memo2

[java][jni][windows]プロセス同期だミューテックス 2008/10/28

Javaです。Windowsです。ミューテックスです。
相互排他の処理でミューテックスです。


注意点、CloseHandleは重要かも。存在チェックのためにCreateMutex使ってもCloseHandleしたほうがよい!?

Javaから呼び出して、ミューテックスを作ったJavaがexitするとミューテックスをリリースしてくれているようなので、まず存在チェックして、なければCreateMutexする流れでよいと思う。
もちろんアプリケーションの起動シーケンス、環境、がシビアでない場合だけど。。。

JNIで、GetStringUTFCharsしたら、ReleaseStringUTFCharsを忘れないこと、繰り返し実行で、メモリリークよくわかる。Orz....

かっこわるいですがとりあえず、JNIコード(Cベース)

JNIEXPORT jboolean JNICALL Java_WindowsMutex_existMutex
(JNIEnv *env, jobject obj, jstring name)
{

const char *sname = (*env)->GetStringUTFChars(env, name, NULL);

HANDLE hMutex = CreateMutex(NULL, FALSE, sname);

if(hMutex == NULL){
(*env)->ReleaseStringUTFChars(env, name, sname);
return FALSE;
}

//既に存在している。
if(GetLastError() == ERROR_ALREADY_EXISTS){
CloseHandle(hMutex);
(*env)->ReleaseStringUTFChars(env, name, sname);
return TRUE;
}

CloseHandle(hMutex);
(*env)->ReleaseStringUTFChars(env, name, sname);
return FALSE;
}

[java][windows]共有メモリ - ファイルマッピング 2008/10/27

Javaです。windowsです。JNIで共有メモリです。
ファイルマッピングを使ってです。


ソースコード参考(まんまですが....)


動作させていません。(>_<)!
static {
System.loadLibrary("WindowsSharedMemory");
};

public native int CreateFileMapping();

public native int MapViewOfFile(int handle);

public native int ReadMemory(int addr);

public native int WriteMemory(int addr, int data);

public native boolean CloseMemory(int handle, int addr);



JNIのコード
#include <windows.h>
#include "jni.h"

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_CreateFileMapping(JNIEnv *env, jobject obj) {
return((jint)CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, 0x100, "SharedMemory"));
};

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_MapViewOfFile(JNIEnv *env, jobject obj, jint handle) {
return((jint)MapViewOfFile((HANDLE)handle, FILE_MAP_ALL_ACCESS, 0, 0, 0));
};

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_ReadMemory(JNIEnv *env, jobject obj, jint addr) {
return((jint)(*(unsigned char *)addr));
};

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_WriteMemory(JNIEnv *env, jobject obj, jint addr, jbyte data) {
return(*((unsigned char *)addr) = data);
};

JNIEXPORT jboolean JNICALL Java_WindowsSharedMemory_CloseMemory(JNIEnv *env, jobject obj, jint handle, jint addr) {
UnmapViewOfFile((void *)addr);
return((jboolean)CloseHandle((HANDLE)handle));
};

[SWT windows]GetAsyncKeyStateでキーイベント処理 2008/09/25

Windowsです。SWTです。
GetAsyncKeyStateを使ってキーイベントを取得します。
下記のコードは、ALT + SHITFTキーの同時押しを念頭において作成しています。
ALTキーはVK_MENUなのかと勝手に類推して作成しています。

参考



import org.eclipse.swt.internal.win32.OS;

public class TestEvent {

public static void main(String[] args) {

key_alt_shift();
}

static void key_alt_shift() {

while (true) {

int s1 = OS.GetAsyncKeyState(OS.VK_MENU) & 0x8000;// alt key???
int s2 = OS.GetAsyncKeyState(OS.VK_SHIFT) & 0x8000;

System.out.println(s1 + " " + s2);

/*
* 同時押しかどうか....
*/
if (0 < s1 && 0 < s2) {
System.out.println("*** BINGO!!");
}

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}