我在网上找到了许多关于用于 C++ 库的 JNA 的参考(包括 stackoverflow 上的一些),但我在 JNA 文档中找不到任何内容表明这是可能的。特别是,似乎没有任何方法可以包装 C++ 类。
我需要本机访问才能使用 RTAudio,但 RTAudio 的所有函数都是 RTAudio 类的成员函数。所以只是想确认一下,JNA 不是正确的选择吗?
这个问题的意思是问如何使用 JNA 调用 C++ 实例方法 https://stackoverflow.com/questions/1873194/jna-calling-methods-upon-c-instance-passed-back-from-dll,这是可能的,但你必须做一些工作。特别是,您需要编写一个包装器extern "C"
s 您实际需要调用的任何函数。
对于任意任意type* function()
定义,您可以使用 JNA 映射该方法作为返回com.sun.jna.Pointer
,但您将无法从 JNA 调用 C++ 对象上的方法。
一个简单的解决方法是编写一个 C 接口库,它只需为您调用对象上的方法...所以如果您有一些成员函数foo()
您可以从 C++ 代码中导出 C 方法:
extern "C" void bar(type* var){
var->foo();
}
显然这会给你增加一些工作......但我怀疑切换到的开销JNI http://en.wikipedia.org/wiki/Java_Native_Interface大概是一样的。
JNA 只关心方法在 DLL 中导出的方式——而且必须是withoutC++ 装饰(因此extern "C"
),因此您可以在任何此类方法中执行您需要的任何操作,而无需公开您调用的方法。
在我上面设计的例子中,这意味着foo()
,只要它是在 DLL 中定义的,实际上甚至不必公开。由于它是一个 C++ 函数,JNA 无法直接调用它,但可以从 JNA 可以调用的函数内调用它,这就是我提出的解决方案有效的原因。
所以,是的,您可以将对所有成员函数(创建、操作、销毁)的调用完全封装在单个函数中,而 JNA 不会关心。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)