【发布时间】:2011-03-02 15:18:49
【问题描述】:
免责声明:我几乎忽略了关于 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);
所以我的问题是,当我们想在 Java 中通过 JNA 使用这些 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 函数???我想我必须创建一个指针并将其提供给函数,但是如何在 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
}
有什么想法吗?
谢谢!
【问题讨论】:
-
您的 C++ 函数和方法是否被正确导出?
-
@AJG85:是的,它们是 API 的一部分。
标签: java c++ pointers java-native-interface jna