2013-05-02 2 views
0

저는 JNA를 매우 신.습니다. 임이 구조 변수를 업데이트하는 라이브러리 호출에 전달하는 문제가 있습니다. main 메소드에서 C 코드로 직접 처리하면 작동하지만 JNA를 사용하여 액세스하려고하면 값이 업데이트되지 않습니다. 값은 얻으려고 노력 메신저JNA는 값을 갱신하지 않습니다.

은 다음과 같습니다 버리는, serName, HW, hwName, OEM, oemName

방법 내가 JNA에 액세스하려고 해요 :이의

__declspec(dllexport) Bool _cdecl 
GetSN(
     DevProgramInfo   * pDevProgInfo, 
     unsigned char    sessionID) { 


    unsigned char     * pCmd; 
    unsigned short     cmdLen = 0; 
    Platform_Access_Get_SN_Payload  * pBufGetSN; 

    pCmd = (unsigned char *)&Cmd; 
    pBufGetSN = (Platform_Access_Get_SN_Payload *)&Payload; 

    ClearMsgHeader((Message *)pCmd); 

    Platform_Get_SN(pCmd, sessionID, &cmdLen, (unsigned char *)pBufGetSN); 
    USBWriteToDevice(&pDevProgInfo->deviceInfo, pCmd, &cmdLen); 
    USBReadFromDevice(&pDevProgInfo->deviceInfo, pCmd); 
    Platform_Get_SN(pCmd, sessionID, &cmdLen, (unsigned char *)pBufGetSN); 

    pDevProgInfo->sn.sn.ser = pBufGetSN->resp.ser; 
    strcpy((char *)pDevProgInfo->sn.sn.serName, (char *)pBufGetSN->resp.serName); 
    pDevProgInfo->sn.sn.hw = pBufGetSN->resp.hw; 
    strcpy((char *)pDevProgInfo->sn.sn.hwName, (char *)pBufGetSN->resp.hwName); 
    pDevProgInfo->sn.sn.oem = pBufGetSN->resp.oem; 
    strcpy((char *)pDevProgInfo->sn.sn.oemName, (char *)pBufGetSN->resp.oemName); 

    return TRUE; 
} 

내 JNA 선언 방법은

public boolean GetSN(DevProgramInfo devInfo, byte sessionID); 

내가 자바 구조를 구축가 여기에 자바 작성 "sn.sn"입니다

내가 코드를 변수 (SER, serName, HW, hwName, OEM, oemName)의

myJNA.getSN(devInfo, (byte) 0); 

모두 사용 292,630,183,210는 0이다. 필자는 약 1 주일 동안이 문제에 대해 잘 모르겠다. 문제를 파악할 수없는 것 같다.

printf를 DLL에 추가하면 올바른 값이 구조체에 생성되지만 Java의 객체에는 해당 값이 표시되지 않습니다.

도움이 될 것입니다.

답변

1

Union을 사용 중입니다. "액티브"타입을 설정하지 않는 한, JNA는 단지 원시 필드를 자동으로 읽을 수 있습니다 (실제로 유니온의 'const char *'필드가 값이 0 인 정수일 경우이 필드를 다시 읽지 않기를 원할 것입니다).

알고 계시다면 전화 전에 Union.setType(Class)으로 전화하십시오. 그렇지 않으면 네이티브 호출 후에 Structure.read() 다음에 호출하십시오.

+0

이것은 정확히 문제가되었습니다. 도와 줘서 고마워. 그 문제는 내가 코드를 수정하는 데 얼마나 많은 시간을 할애했는지에 대해 정말 화를 냈다. 그 해결책은 분명히 더 단순 해졌다가 예상되었다. – meriley

+0

지금은 다른 문제가있는 것 같습니다. C 코드의 마지막 4 바이트는 자바 코드의 처음 4 바이트와 그 뒤에 많은 쓰레기가옵니다. – meriley

+0

좀 더 명확하게 설명해야합니다. "C 코드"는 일반적으로 소스 파일에 대해 언급하지 않는 한 "마지막 4 바이트"를 갖지 않습니다. – technomage

관련 문제