Java Native Access不做C ++,对吧?

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

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

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

对于任何type* function()定义,您可以使用JNA将方法映射为返回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可以调用的函数内调用,这就是我提出的解决方案有效的原因。

所以,是的,您可以在单个函数中完全封装对所有成员函数(创建,操作,销毁)的调用,而JNA将无关紧要。

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

BridJ是JNA的精神孩子,它增加了一些有限的C ++支持(+ JNAerator的完全支持)。 如果你没有使用太多的模板,它可能会起作用……

(免责声明:我是BridJ和JNAerator的作者)

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

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

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

我在传球中使用了雅各布并取得了不错的成绩,但我认为这有点过时了。