JNI正在使windows 7中的java崩溃

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

我正在将一段代码从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 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;