繁体   English   中英

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

[英]C++'s out parameter object creation and JNA

免责声明:我几乎忽略了有关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);

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

假设我有以下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函数??? 我想我必须创建一个Pointer并将其提供给函数,但是如何在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“分配内存并绑定句柄”。 Foo f; 创建f并将其分配到内存中。 initializeFoo()可以执行类似的操作,例如,将值分配给f的成员属性等,以及创建另一个Foo对象并将其分配给f,但它不会执行您所说的。

另一方面,

Foo *f;
f = new Foo();

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

我认为您想进一步了解C ++和指针。

由于我对Foo是什么或Foo结构包含的内容一无所知,因此我将创建一个JNA PointerType来声明我的结构

这使得不可能为Foo分配内存,因为您必须知道需要分配多少内存。 对于c结构,jna​​需要一个镜像该结构的java类,或者如果您至少知道其大小,则可以尝试使用Memory类,该类的ctor带有size参数。

对于使用c ++功能(例如继承)的c ++结构和类,由于所需的内存和布局取决于编译器和启用的优化,因此此操作失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM