JNI正在使windows 7中的java崩溃
我正在将一段代码从linux移植到windows,因为Java中不支持linux共享内存段。因此,我们使用Java本机接口(JNI)来访问共享内存,它在linux平台上运行良好 shmget的代码:JNI正在使windows 7中的java崩溃,java,windows-7,java-native-interface,Java,Windows 7,Java Native Interface,我正在将一段代码从linux移植到windows,因为Java中不支持linux共享内存段。因此,我们使用Java本机接口(JNI)来访问共享内存,它在linux平台上运行良好 shmget的代码: JNIEXPORT jint JNICALL Java_emulatorinterface_communication_shm_SharedMem_shmget (JNIEnv * env, jobject jobj, jint COUNT,jint MaxNumJavaThreads,jint E
JNIEXPORT jint JNICALL Java_emulatorinterface_communication_shm_SharedMem_shmget
(JNIEnv * env, jobject jobj, jint COUNT,jint MaxNumJavaThreads,jint EmuThreadsPerJavaThread,
jlong coremap, jint pid) {
uint64_t mask = coremap;
int size;//=sizeof(packet)*(COUNT+5)*MaxNumJavaThreads*EmuThreadsPerJavaThread;
char str[50];
int ptr;
#ifdef _WIN32
HANDLE hMapFile;
#endif
printf("hello");
size=sizeof(packet)*(COUNT+5)*MaxNumJavaThreads*EmuThreadsPerJavaThread;
/*if (sched_setaffinity(0, sizeof(mask), (cpu_set_t *)&mask) <0) {
perror("sched_setaffinity");
}*/
//set the global variables
gCOUNT = COUNT;
gMaxNumJavaThreads = MaxNumJavaThreads;
gEmuThreadsPerJavaThread = EmuThreadsPerJavaThread;
//size1 is the number of packets needed in the segment.
#ifdef _WIN32
_itoa(pid,str,10);
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL, PAGE_READWRITE,
0,32, str);
if (hMapFile == NULL)
{
exit(1);
}
CloseHandle(hMapFile);
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL, PAGE_READWRITE,
0,size, str);
if (hMapFile == NULL)
{
printf("Unable to create a shared mem file.");
exit(1);
}
if (hMapFile < 0)
{
return (-1);
}
/*
if((hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL, PAGE_READWRITE,
0,size, str))<0)
{
printf("error window %d\n",size);
return (-1);
}
*/
ptr=*((int*)(hMapFile));
return ptr; ///////////////error in return type
#else
有人能指出问题出在哪里吗?您不能取消对文件映射对象的
句柄的引用。只需让函数返回句柄,如下所示:
return (int)hMapFile;
在64位Windows(使用64位JRE/JNI)上,句柄
类型的宽度为64位,但只有较低的32位是有效的,所以这没问题
旁注:
不要使用hMapFile<0
。如果API失败,则返回值为NULL
您确定需要先尝试使用32字节的文件,然后关闭它吗?为什么?
您可能需要调用GetLastError
并针对已存在的错误测试结果(如果您希望能够检测到该情况)
我的回答对你有帮助吗?谢谢你回复。我做了必要的更改。现在我发现错误已经在循环中存在了几次,后来它给出了正确的值。为什么会发生?我如何更正它?@kunal这是另一个问题。我的回答对你的车祸有帮助吗?当CreateFileMapping
说内存映射的命名对象已经存在时,这意味着。。。如果要打开已存在的对象,请使用OpenFileMapping
。另外:你为什么要谈论循环?!?是的,这很有帮助。谢谢。好的,我将尝试使用OpenFileMapping。我的程序要求在循环中运行它,我后来添加了getError逻辑来找出错误。但我不明白为什么它说文件存在了几次迭代,然后成功地创建了对象。为什么会这样?@Kunal感谢您接受这个答案。当CreateFileMapping
说文件已经存在时,这并不是一个真正的错误。返回的句柄有效。这只是表示共享内存已经创建(使用该名称)和/或尚未“关闭”。内存将一直存在,直到最后一个句柄未“关闭”。
return (int)hMapFile;