- 締切済み
共有メモリについて
はじめまして! JAVA初心者です。 JAVAで共有メモリって使えるんですか? Cで生成した共有メモリをアタッチ出来る方法 をご存知の方がいらっしゃいましたら、教えて 頂けないでしょうか? お願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ssr-y6
- ベストアンサー率71% (5/7)
JNIを使ってのWin32共有メモリ(メモリマップトファイル)の作成/使用は、 以下のようになると思います。 -----Java----- class nativesm { 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); static { System.loadLibrary("nativesm"); }; } public class sharemem { public static nativesm SM; public static void main(String arg[]) { int Handle, Addr, i; SM = new nativesm(); Handle = SM.CreateFileMapping(); System.out.println(Handle); Addr = SM.MapViewOfFile(Handle); System.out.println(Addr); for (i = 0; i < 0x100; i ++) System.out.println(SM.WriteMemory(Addr + i, SM.ReadMemory(Addr + i) + i)); SM.CloseMemory(Handle, Addr); }; } -----C----- #include <windows.h> #include "jni.h" JNIEXPORT jint JNICALL Java_nativesm_CreateFileMapping(JNIEnv, jclass) { return((jint)CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 0x100, "SharedMemory")); }; JNIEXPORT jint JNICALL Java_nativesm_MapViewOfFile(JNIEnv, jclass, jint handle) { return((jint)MapViewOfFile((HANDLE)handle, FILE_MAP_ALL_ACCESS, 0, 0, 0)); }; JNIEXPORT jint JNICALL Java_nativesm_ReadMemory(JNIEnv, jclass, jint addr) { return((jint)(*(unsigned char *)addr)); }; JNIEXPORT jint JNICALL Java_nativesm_WriteMemory(JNIEnv, jclass, jint addr, jbyte data) { return(*((unsigned char *)addr) = data); }; JNIEXPORT jboolean JNICALL Java_nativesm_CloseMemory(JNIEnv, jclass, jint handle, jint addr) { UnmapViewOfFile((void *)addr); return((jboolean)CloseHandle((HANDLE)handle)); };
- a-kuma
- ベストアンサー率50% (1122/2211)
> JAVAで共有メモリって使えるんですか? SYSV でいう IPC は、使えません。だって、unix 以外でも Java は動きますから。 > Cで生成した共有メモリをアタッチ出来る方法 > をご存知の方がいらっしゃいましたら、教えて > 頂けないでしょうか? どうしても、これをやりたい、ということであれば、JNI (Java Native Interface) と 言う方法を使って、Java から C で作った関数を呼ぶことができますので、それを 利用することになります。 # 自称初心者には、荷が重いかも