저는 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의 객체에는 해당 값이 표시되지 않습니다.
도움이 될 것입니다.
이것은 정확히 문제가되었습니다. 도와 줘서 고마워. 그 문제는 내가 코드를 수정하는 데 얼마나 많은 시간을 할애했는지에 대해 정말 화를 냈다. 그 해결책은 분명히 더 단순 해졌다가 예상되었다. – meriley
지금은 다른 문제가있는 것 같습니다. C 코드의 마지막 4 바이트는 자바 코드의 처음 4 바이트와 그 뒤에 많은 쓰레기가옵니다. – meriley
좀 더 명확하게 설명해야합니다. "C 코드"는 일반적으로 소스 파일에 대해 언급하지 않는 한 "마지막 4 바이트"를 갖지 않습니다. – technomage