Прежде всего, JNA автоматически обрабатывает свои собственные выделения памяти, что означает, что следующая строка бесполезна (и может повредить стек памяти):
myPointer.clear(size); //is this required to clear the memory and release the Pointer to the GC??
Далее она также автоматически обрабатывает собственные типы указателей, что означаетчто обе строки ниже эквивалентны в вашем случае:
public int myCfunc(Pointer s, IntByReference ls);
public int myCfunc(myClass s, IntByReference ls);
и, следовательно, JNA сделает для вас myObj.write();
и read
.
Следующее является 100% правильным, но я предлагаювы регистрируете len.getValue()
до и после вашего звонка на myCfunc
(что может дать 3 * 4 = 12; 3 int из 4 байтов):
int size = Native.getNativeSize(myClass.class);
IntByReference len = new IntByReference(size);
Если все это правильно, то вы, вероятно, имеетеошибка в прототипе вашей структуры.
По моему опыту, это в основном из-за устаревшего заголовочного файла C или устаревшей библиотеки:
- Вы используете версию заголовка 2.0, в которой говорится, что структуразначения int, но ваша ссылка на библиотеку v1.0, которая принимает байтовую структуру
- Вы используете заголовок версии 2.0, в котором говорится, что значения структуры являются int, но ваш linking против библиотеки v1.9, которая занимает два целых числа и байт
, в конце ваш код должен выглядеть следующим образом:
public void foo(){
myWrapper wrapper = (myWrapper) Native.loadLibrary("SomeDllWithLegacyCode", myWrapper.class);
myClass myObj = new myClass();
myObj.x = 1;
myObj.y = 2;
int size = Native.getNativeSize(myClass.class);
IntByReference len = new IntByReference(size);
//log len.getValue
wrapper.myCfunc(myObj, len);
//log len.getValue
}
Вы также можете попробовать добровольно уменьшить значение len для целей отладки, например:
IntByReference len = new IntByReference(size-1);
IntByReference len = new IntByReference(size-2);
IntByReference len = new IntByReference(size-3);
//...
IntByReference len = new IntByReference(size-11);
Это не будет делать то, что вы не хотите, но, по крайней мере, оно должно дать вам правильный "max len"