JNI-код отлично работает в Windows XP, но вылетает в Windows 7 - PullRequest
0 голосов
/ 01 апреля 2012

Я использую приведенный здесь код: http://www.microchip.com/forums/tm.aspx?m=278617 для передачи данных через порт USB с использованием Java.Он отлично работает в 32-битной ОС Windows XP.Но когда я пытаюсь вызвать тот же метод прерывания для отправки отчета о выходе в среде Windows 7 32-битной ОС, JNI дает сбой внешней JVM.отчет о сбое можно найти здесь: http://pastebin.com/A9USNFFY

Ниже приведена функция, вызывающая сбой JNI:

    JNIEXPORT jboolean JNICALL Java_MyHID_IntSendOutputReport(JNIEnv *jEnv, jobject     jObj, jbyteArray outputReport)
       {
    boolean Result = false;
    byte *buffer = new byte[Capabilities.OutputReportByteLength];
    jboolean isCopy = JNI_TRUE;
    buffer = (byte*)jEnv->GetByteArrayElements(outputReport, &isCopy);

    /*
    API Function: WriteFile
    Sends a report to the device.
    Returns: success or failure.
    Requires:
    A device handle returned by CreateFile.
    A buffer that holds the report.
    The Output Report length returned by HidP_GetCaps,
    A variable to hold the number of bytes written.
    */

    DWORD BytesWritten = 0;
    if (WriteHandle != INVALID_HANDLE_VALUE) Result = WriteFile
                                                        (WriteHandle, 
                                                        buffer, 
                                                        Capabilities.OutputReportByteLength, 
                                                        &BytesWritten, 
                                                        NULL);

    delete buffer;
    return Result;
}

Итак, кто-нибудь может помочь мне найти причину, по которой JNI работаетпотерпел крах за пределами JVM под средой Windows 7 32bit OS?Заранее спасибо.

1 Ответ

1 голос
/ 02 апреля 2012

Ваш код совершенно неверный.Трудно поверить, что он когда-либо работал на любой платформе.Удалите вызов new и строку delete.buffer выделяется при вызове GetByteArrayElements().Если для isCopy установлено значение TRUE, вы должны затем вызвать ReleaseByteArrayElements() с buffer и JNI_ABORT в качестве аргументов.

Вы понимаете, что есть пакеты Java для USB?

...