10

我在网上找到了许多关于 JNA 用于 C++ 库的参考资料(包括一些关于 stackoverflow 的参考资料),但我在 JNA 文档中找不到任何东西表明这是可能的。特别是,似乎没有任何方法可以包装 C++ 类。

我需要本地访问才能使用 RTAudio,但 RTAudio 的所有函数都是 RTAudio 类的成员函数。所以只是为了确认,JNA 不是正确的方法吗?

4

4 回答 4

17

这个问题相当于询问如何使用 JNA 调用 C++ 实例方法,这是可能的,但您将不得不做一些工作。特别是,您需要编写一个包装器,其中extern "C"包含您实际需要调用的任何函数。

对于任何任意type* function()定义,您都可以使用 JNA 将方法映射为返回 a com.sun.jna.Pointer,但您将无法从 JNA 调用 C++ 对象上的方法。

一个简单的解决方法是编写一个 C 接口库,它只是为您调用对象上的方法......所以如果您有一些成员函数foo(),您可以从 C++ 代码中导出 C 方法:

extern "C" void bar(type* var){
   var->foo();
}

显然这会为您增加一些工作......但我怀疑切换到JNI的开销大致相同。

JNA 只关心在 DLL 中导出方法的方式——并且必须没有C++ 装饰(因此使用extern "C".

在我上面的人为示例中,这意味着foo()只要在 DLL 中定义它,实际上甚至不必公开。由于它是一个 C++ 函数,因此 JNA 不能直接调用它,但可以从 JNA 可以调用的函数中调用它,这就是我提出的解决方案有效的原因。

So, yes, you can fully encapsulate calls to all the member functions (create, operate, destroy) in a single function and JNA won't care.

于 2010-02-11T04:48:09.427 回答
3

试试痛饮。它将为您创建 c++ 类的包装器。

于 2010-02-11T04:16:22.997 回答
3

BridJ is a spiritual child of JNA that adds some limited C++ support (+ full support from JNAerator). If you're not using too many templates it might just work...

(disclaimer: I'm the author of BridJ & JNAerator)

于 2013-02-19T17:03:27.793 回答
1

没错,JNA 是用于访问本机库。我认为你需要的是一个 Java - COM Bridge。如果是这种情况,有一些免费的替代方案:

JCOM http://sourceforge.net/projects/jcom

雅各布http://sourceforge.net/projects/jacob-project

我在传球中使用了 Jacob 并取得了不错的效果,但我认为它有点过时了。

于 2010-02-11T02:00:53.133 回答