2016-03-10 1 views
1

Мне нужно перевести приложение из 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.

Есть ли у вас какие-либо идеи, как обрабатывать этот глобальный блок памяти в трех частях?

+0

Для справки C! = C++. Ваш собственный код кажется прямым C. – technomage

+0

В какой-то момент в заголовках есть 'typedef', который определяет, что на самом деле означает' HGLOBAL' (например, 'typedef void * HGLOBAL;'). Найдите это и включите его в свой вопрос. Скорее всего, вы можете просто притвориться, что это непрозрачный указатель и использовать «Pointer» JNA. JNA будет обрабатывать массив «Pointer» просто отлично (например, «Pointer [] hImage = new Pointer [3];'). – technomage

+0

@technomage К сожалению, нет ничего подобного «typedef ... HGLOBAL;». Я уже думал об этом. Указатель [] не работает. Указатель [0] заполняется, но другие все еще являются нулевыми, и все же «ImageProcessFromRaw» возвращает 0 вместо 1 (успех). Что вы думаете о PointerByReference? Может, это сработает? – MrSea

ответ

1
... 
int ABC_Shell(String command, int len, Pointer[] response, int buflen); 
int ABC_ImageProcessFromRaw(Pointer hFront, Pointer hRear); 
... 

Pointer[] response = new Pointer[3]; 
// You should probably be more programmatic about the command buffer and its length 
api.ABC_Shell("CP12", 8, response, response.length * Pointer.SIZE); 
api.ABC_ImageProcessFromRaw(response[0], null); 

 Смежные вопросы

  • Нет связанных вопросов^_^