Заявление об ограничении ответственности: я почти все игнорирую в C ++, поэтому надеюсь, что не говорю здесь глупостей. Если да, пожалуйста, поправьте меня.
Как разработчик Java, когда я хочу создать новый объект, я использую метод конструктора, который выделит этот объект в памяти и вернет ему дескриптор для меня, и я сохраню этот дескриптор в переменной, я делаю это так .
Foo o = new Foo();
Но в C ++ мне дали понять, что, несмотря на то, что это возможно
Foo createFoo(){
Foo f;
f.doSomething();
return f;
}
// ...
Foo f = createFoo();
Я также могу самостоятельно определить дескриптор, а затем вызвать для него инициализатор, который выделит память и привяжет к нему дескриптор, например:
void initializeFoo(Foo **f){
f.doSomething();
return;
}
// ...
Foo f;
initializeFoo(&f);
Итак, мой вопрос: что произойдет, если мы захотим использовать эти методы C ++ в Java с JNA?
Предположим, у меня есть следующий заголовок C ++:
typedef struct Foo f;
Foo createFoo();
void initializeFoo(Foo **f);
Поскольку я понятия не имею, что такое Foo или что содержит структура Foo, я просто собираюсь создать JNA PointerType для объявления моей структуры:
public class Foo extends PointerType{
public Foo(Pointer address) {
super(address);
}
public Foo() {
super();
}
}
Использование метода createFoo также должно быть довольно простым:
public class TestFoo{
static{
System.loadLibrary("foolib");
}
public static void main(String[] args){
FooLib lib = (FooLib)Native.loadLibrary("foolib", FooLib.class);
Foo f = lib.createFoo();
}
Правильно?
Но у меня вопрос, как я могу использовать функцию initializeFoo ??? Я полагаю, мне нужно было бы создать указатель и передать его функции, но как мне создать указатель, отличный от NULL в JNA? Я пробовал следующий код, но он дает EXCEPTION_ACCESS_VIOLATION.
public class TestFoo{
static{
System.loadLibrary("foolib");
}
public static void main(String[] args){
FooLib lib = (FooLib)Native.loadLibrary("foolib", FooLib.class);
Foo f = new Foo();
lib.initializeFoo(f); // EXCEPTION_ACCESS_VIOLATION
lib.initializeFoo(f.getPointer()); // EXCEPTION_ACCESS_VIOLATION
}
Любая идея?
Спасибо!