Отказ от ответственности: Я почти все игнорирую в 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 ???Я полагаю, мне нужно было бы создать указатель и передать его функции, но как мне создать ненулевой указатель в 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
}
Есть идеи?
Спасибо!