使用Java来包装C++

spa*_*der 11 c++ java user-interface wrapper

我有一个用C++编写的项目,我正在寻找一个Java GUI作为它的接口.Java的选择是固定的,所以我需要学习如何从Java调用C++代码.重写C++代码不是一种选择.我想输入:

  1. 我可以用什么工具来实现这种包装.
  2. 如果有的话,我必须修改多少C++代码.
  3. 您有任何其他见解/跟进问题.

谢谢.

Mat*_*ogt 7

我最近参与了一个项目,我们必须做同样的事情.我们有一个用C++编写的数据模型,需要将Java GUI放在首位.我们最终做的是确定我们需要从GUI访问的C++类,并使用SWIG生成包含C++对象的普通旧java类.

http://www.swig.org/

SWIG生成的Java类与它们包装的C++类具有相同的接口,这意味着与Java的C++对象进行通信只涉及使用Java对象.

这是一个例子:

给出两个C++类:

class SomeClass {
public:
  void foo(SomeOtherClass bar);
  SomeOtherClass baz();
}

class SomeOtherClass {
public:
  void do();
}
Run Code Online (Sandbox Code Playgroud)

SWIG将生成两个Java类:

public class SomeClass {
  public void foo(SomeOtherClass bar);
  public SomeOtherClass baz();
}

public class SomeOtherClass {
  public void do();
}
Run Code Online (Sandbox Code Playgroud)

从Java调用C++对象就像编写常规Java一样:

SomeClass sc = new SomeClass();
SomeOtherClass soc = sc.baz();
sc.foo(soc);
Run Code Online (Sandbox Code Playgroud)

第1行:实例化SomeClass的Java包装器以及SomeClass类型的C++对象.

第2行:对SomeClass的sc实例的调用被转发到SomeClass的C++实例.C++实例的返回值传递给Java包装器并由Java包装器返回.

第3行:SWIG处理从Java包装器类型(或java原始类型)到基础C++类型的转换.

SWIG将负责在方法调用期间转换为/从Java/C++类型转换,并且所有JNI细节都隐藏在视图之外:)

为C++类生成Java包装器所需的SWIG接口代码可以简单如下:

interface.i:{#include"ClassDefinition.h"}%include"ClassDefinition.h"

SWIG非常强大.您需要做的任何事情都可以使用基本功能,类型映射,javacode类型映射或控制器.

SWIG还允许您的C++代码调用Java对象,而无需修改现有的C++代码.这是一种称为"跨语言多态"的功能.跨语言多态性本质上允许您创建子类C++类的Java类.然后,您可以将这些Java类的实例作为参数传递给C++方法调用.来自C++的所有调用都将传递回Java对象.我不会在这里详细介绍,但是一旦你克服了这个想法的最初震撼,它就不会非常复杂.


jos*_*efx 5

JNI

  • 如果你的代码是c ++
  • JNI是java运行时的一部分
  • 声明本机函数并使用javah生成ac/c ++标头
  • 编写c/c ++代码,将代码粘贴到java方法中

JNA

  • 如果您的代码有ac api
  • 不适用于c ++类
  • JNA不是java运行时的一部分,jna.jar是300kb
  • 使用您使用的c方法声明一个java接口
  • 编写java代码将您的DLL粘贴到java
  • 需要创建dll函数使用的c结构的java副本

它们都是平台无关的.我更喜欢jna,因为它很容易弄乱jni代码.还有几种与平台相关的解决方案 - 但我不太了解它们.

  • JACOB:java COM桥(windows)
  • ...


Vic*_*tor 4

您应该寻找 JNI - Java 本机接口