Мне нужно перевести приложение из C++ в Java, но оно использует dll, поэтому мне нужно использовать JNA. Приложение должно сканировать что-то с устройства. Вот приложение в C++:Определить HGlobal в JNA
//HEADERS
ABC_Shell = (int (*)(char* cmd, int len, char* rsp, int buflen))GetProcAddress(g_hLib, "ABC_Shell");
ABC_ImageProcessFromRaw = (int (*)(HGLOBAL hFront, HGLOBAL hRear))GetProcAddress(g_hLib, "ABC_ImageProcessFromRaw");
//END
HGLOBAL hImage[3];
memset(hImage, 0, sizeof(hImage));
nRet = ABC_Shell("CP12", strlen(szShell), (char*)hImage, sizeof(hImage));
ABC_ImageProcessFromRaw(hImage[0], hImage[1]); //FACE, BACK RGB IMAGE
ABC_ImageProcessFromRaw(hImage[2], NULL); //FACE IR IMAGE
SaveImage(0, hImage[0], hImage[1], hImage[2]);
А вот в Java:
//HEADERS
int ABC_Shell(String command, int len, byte[] response, int buflen);
int ABC_ImageProcessFromRaw(byte[] hFront, byte[] hRear);
//END
byte[] response = new byte[64];
api.ABC_Shell("CP12", 8, response, 1024); // it works, but response is strange
api.ABC_ImageProcessFromRaw(response, null);
Конечно устройство сканирования, но я не знаю, какой переменной использования принять ответ и после этого используйте его в следующей функции. В C++ есть HGlobal [3], в JNA нет ничего подобного. Я смотрел здесь - https://jna.java.net/javadoc/platform/com/sun/jna/platform/win32/W32API.html.
Есть ли у вас какие-либо идеи, как обрабатывать этот глобальный блок памяти в трех частях?
Для справки C! = C++. Ваш собственный код кажется прямым C. – technomage
В какой-то момент в заголовках есть 'typedef', который определяет, что на самом деле означает' HGLOBAL' (например, 'typedef void * HGLOBAL;'). Найдите это и включите его в свой вопрос. Скорее всего, вы можете просто притвориться, что это непрозрачный указатель и использовать «Pointer» JNA. JNA будет обрабатывать массив «Pointer» просто отлично (например, «Pointer [] hImage = new Pointer [3];'). – technomage
@technomage К сожалению, нет ничего подобного «typedef ... HGLOBAL;». Я уже думал об этом. Указатель [] не работает. Указатель [0] заполняется, но другие все еще являются нулевыми, и все же «ImageProcessFromRaw» возвращает 0 вместо 1 (успех). Что вы думаете о PointerByReference? Может, это сработает? – MrSea