代码之家  ›  专栏  ›  技术社区  ›  Yuvi Masory

Java本地访问不做C++,对吗?

  •  8
  • Yuvi Masory  · 技术社区  · 15 年前

    我在网上找到了许多引用(包括一些StAdvExcel)到JNA用于C++库,但是我在JNA文档中找不到任何可能的引用。似乎没有任何方式来包装C++类,特别是。

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

    4 回复  |  直到 12 年前
        1
  •  13
  •   Community CDub    8 年前

    这个问题的意义是什么? how to call C++ instance methods using JNA 这是可能的,但你得做些工作。特别是,您需要编写一个包装器, 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 也差不多。

    JNA只关心方法在DLL中的导出方式——而这必须是 没有 C++装饰(因此) 外部“C” ,因此,您可以在任何此类方法中执行所需的任何操作,而无需公开您调用的方法。

    在我上面的人为例子中,这意味着 英尺() ,只要它是在dll中定义的,实际上就不必公开。由于它是一个C++函数,JNA不能直接调用它,但它可以从JNA可以调用的函数中调用,这就是为什么我提出的解决方案工作的原因。

    所以,是的,您可以将对所有成员函数(创建、操作、销毁)的调用完全封装在一个函数中,JNA不会在意。

        2
  •  3
  •   Denis Tulskiy    15 年前

    尝试 Swig .它将为您创建C++类的包装器。

        3
  •  2
  •   zOlive    12 年前

    BridJ 是JNA的一个精神孩子,添加了一些有限的C++支持(+完全支持) JNAerator )如果你不使用太多的模板,它可能只是工作…

    (免责声明:我是Bridj&jnarator的作者)

        4
  •  1
  •   Alonso    15 年前

    你说得对,JNA是用来访问本机库的。我认为你需要的是一个Java-com桥。如果是这样的话,有几个免费的选择:

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

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

    我在传球中利用了雅各布,取得了很好的成绩,但我觉得这有点过时了。