gpt4 book ai didi

java - C++的out参数对象创建和JNA

转载 作者:行者123 更新时间:2023-11-28 01:07:52 26 4
gpt4 key购买 nike

免责声明:我忽略了几乎所有关于 C++ 的内容,所以我希望我没有在这里说愚蠢的话,如果我是,请随时纠正我。

作为一名 Java 开发人员,当我想创建一个新对象时,我会使用一个构造函数方法在内存中分配这个对象并为我返回一个句柄,我会将这个句柄存储在一个变量中,我这样做像这样。

Foo o = new Foo();

但在 C++ 中,我已经明白,尽管事实上这样做是可能的

Foo createFoo(){
Foo f;
f.doSomething();
return f;
}

// ...

Foo f = createFoo();

我也可以自己定义一个句柄,然后在它上面调用一个初始化器来分配内存并绑定(bind)句柄,就像这样:

void initializeFoo(Foo **f){
f.doSomething();
return;
}

// ...

Foo f;
initializeFoo(&f);

所以我的问题是,当我们想通过 JNA 在 Java 中使用这些 C++ 方法时会发生什么情况?

假设我有以下 C++ header :

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 中创建一个非 NULL 指针?我尝试了以下代码,但它导致了 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
}

有什么想法吗?

谢谢!

最佳答案

Foo f;
initializeFoo(&f);

initializeFoo() 不会像您所说的那样为 f“分配内存并绑定(bind)句柄”。 Foo f; 创建 f 并将其分配到内存中。 initializeFoo() 可以做一些事情,比如为 f 的成员属性赋值等,以及创建另一个 Foo 对象并将其赋值给 f,但它不会按照你说的去做。

另一方面,

Foo *f;
f = new Foo();

声明一个 Foo 指针。 new 分配内存并创建一个 Foo 对象,并将内存位置分配给 f(您可以将指针视为包含地址的整数)。

我认为您想在进一步学习之前了解更多有关 C++ 和指针的知识。

关于java - C++的out参数对象创建和JNA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5169558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com