Мне нужно использовать DLL внутри моего Java-приложения.DLL экспортирует некоторый набор функций, авторы назвали это «Direct DLL API».Я пытаюсь определить в Java эквивалент следующего объявления функции:
int XcCompress( HXCEEDCMP hComp, const BYTE* pcSource, DWORD dwSourceSize, BYTE** ppcCompressed, DWORD* pdwCompressedSize, BOOL bEndOfData );
Внутри моего интерфейса, расширяющего библиотеку, я объявил это следующим образом:
int XcCompress(WString hComp, Pointer pcSource, int dwSourceSize, Pointer[] ppcCompressed, IntByReference pdwCompressedSize, boolean bEndOfData);
Проблема возникает каждый раз, когда я получаюошибка:
Исключение в потоке "main" java.lang.Error: Неверный доступ к памяти
Так что в основном я застрял на этом этапе.
HXCEEDCMP hComp
- предполагается хранить обработчик для функции и отлично работает как WString для инициализации DLL / уничтожения функций DLL, поэтому я сохранил это так.
Ссылка на заголовок "существо":
typedef HXCEEDCMP ( XCD_WINAPI *LPFNXCCREATEXCEEDCOMPRESSIONW )( const WCHAR* );
const BYTE* pcSource
- это исходные данные для сжатия, внутри моего кода я создаю его следующим образом:
private static Pointer setByteArrayPointer(String dataToCompress) {
Pointer pointer = new Memory(1024);
pointer.write(0, dataToCompress.getBytes(), 0,
dataToCompress.getBytes().length);
return pointer;
}
DWORD dwSourceSize
- для этого я получаю зарезервированный объем памяти следующим образом:
String testData = "ABCDABCDABCDAAD";
Pointer source = setByteArrayPointer(testData);
(int) ((Memory)source).size()
BYTE** ppcCompressed
- функция должна заполнить ссылку ppcCompressed после выполнения работы.Я предполагаю, что допустил ошибку, сделав это следующим образом:
Pointer[] compressed = {new Pointer(1024), new Pointer(1024)};
DWORD* pdwCompressedSize
- возвращается по размеру функции сжатых данных.Я сопоставляю это следующим образом:
IntByReference intByReference = new IntByReference();
Не уверен, если это хорошая идея, а также ..
BOOL bEndOfData
- мне нужно установить значение true.
Наконец, мой вызов метода, который возвращает ошибку, выглядит следующим образом:
xceedApiDll.XcCompress(handle, source, (int) ((Memory)source).size(), compressed, intByReference, true);
Любая помощь будет оценена.Спасибо.