2014-10-24 2 views
2

Я написал DLL, который должен быть использован в Java:Недопустимый доступ к памяти

public interface MyInterface extends Library { 
    public void GetDllVersion(char[] buffer, int bufferLen); 
    ... 
} 

MyInterface instance=(MyInterface) Native.loadLibrary(basename,MyInterface.class); 
char[] buffer=new char[20]; 
instance.GetDllVersion(buffer,buffer.length); 

Соответствующий C Код является

void __declspec(dllexport) GetDllVersion(char *buffer,int bufferLen) { 
    ... 
} 

Я также обратился jna.debug_load дальше, чтобы увидеть некоторые результаты. Lib загружается, как и ожидалось, но вызов GetDllVersion завершается с

Exception in thread "main" java.lang.Error: Invalid memory access 
    at com.sun.jna.Native.invokeVoid(Native Method) 
    at com.sun.jna.Function.invoke(Function.java:367) 
    at com.sun.jna.Function.invoke(Function.java:315) 
    at com.sun.jna.Library$Handler.invoke(Library.java:212) 
    at com.sun.proxy.$Proxy0.GetDllVersion(Unknown Source) 
    at Main.main(Main.java:34) 

Dependency Walker показывает, что DLL экспортирует эту функцию.

Как узнать, что именно не так с вызовом функции?

+0

Возможно, GetDllVersion ожидает, что буфер будет длиннее 20 байтов? – Creris

+0

В целях тестирования я прокомментировал все внутри тела метода GetDllVersion. Таким образом, практически эта функция ничего не делает – gorootde

+0

@k_wave. Значит, у вас нет способа использовать отладчик для отладки функции DLL? Я уверен, что DLL можно отлаживать с помощью отладчика, и вам нужно выяснить, как это сделать. – PaulMcKenzie

ответ

2

Ваша проблема связана с несоответствием в размере Java 16 бит полукокса против размера C 8 бит полукокса. Одним из решений является передача данных в виде байта [].

public void GetDllVersion(byte[] buffer, int bufferLen); 

и

__declspec(dllexport) void GetDllVersion(byte *buffer,int bufferLen) { 

Другим решением является использование широкого полукокса на родной стороне.

__declspec(dllexport) void GetDllVersion(wchar_t *buffer,int bufferLen) { 
Смежные вопросы