В моем C API есть следующие функции:
MyStruct *create();
void destroy(MyStruct **s);
Я сопоставляю их с помощью JNA:
Pointer create();
void destroy(Pointer p);
У меня есть класс, который загружает общую библиотеку и использует эти функции:
class MyClass{
private mySharedLibrary library;
private Pointer p;
public MyClass(){
this.library = (MySharedLibrary)Native.loadLibrary("mylibrary", MySharedLibrary.class);
this.p = library.create();
}
}
Я не знаю, когда и как вызвать функцию destroy... Или я не должен ее вообще называть? В Java нет деструкторов. Более того, он получает MyStrct ** в качестве аргумента... Что мне делать?
Ваш класс должен предоставить явное destroy
, которое затем вызывается с использованием шаблона try-with-resources.
Если try-with-resources недоступны для вас и по какой-либо причине не используют явную очистку, вы можете использовать финализатор. Хотя они не гарантируются, в большинстве случаев это, вероятно, достаточно хорошо.
class MyClass {
private Object finalizer = new Object {
protected void finalize() {
if (MyClass.this.p != null) {
MyClass.this.library.destroy(MyClass.this.p);
MyClass.this.p = null;
}
}
}
}
Обратите внимание, что вы должны тщательно протестировать свой собственный прецедент, чтобы гарантировать, что память будет исправлена в соответствии с вашими потребностями.
destroy
верна? Похоже, что он принимает адрес значения, возвращаемогоcreate
, а не само значение.