我在网上找到了许多关于 JNA 用于 C++ 库的参考资料(包括一些关于 stackoverflow 的参考资料),但我在 JNA 文档中找不到任何东西表明这是可能的。特别是,似乎没有任何方法可以包装 C++ 类。
我需要本地访问才能使用 RTAudio,但 RTAudio 的所有函数都是 RTAudio 类的成员函数。所以只是为了确认,JNA 不是正确的方法吗?
我在网上找到了许多关于 JNA 用于 C++ 库的参考资料(包括一些关于 stackoverflow 的参考资料),但我在 JNA 文档中找不到任何东西表明这是可能的。特别是,似乎没有任何方法可以包装 C++ 类。
我需要本地访问才能使用 RTAudio,但 RTAudio 的所有函数都是 RTAudio 类的成员函数。所以只是为了确认,JNA 不是正确的方法吗?
这个问题相当于询问如何使用 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.
试试痛饮。它将为您创建 c++ 类的包装器。
没错,JNA 是用于访问本机库。我认为你需要的是一个 Java - COM Bridge。如果是这种情况,有一些免费的替代方案:
JCOM http://sourceforge.net/projects/jcom
雅各布http://sourceforge.net/projects/jacob-project
我在传球中使用了 Jacob 并取得了不错的效果,但我认为它有点过时了。