spa*_*der 11 c++ java user-interface wrapper
我有一个用C++编写的项目,我正在寻找一个Java GUI作为它的接口.Java的选择是固定的,所以我需要学习如何从Java调用C++代码.重写C++代码不是一种选择.我想输入:
谢谢.
我最近参与了一个项目,我们必须做同样的事情.我们有一个用C++编写的数据模型,需要将Java GUI放在首位.我们最终做的是确定我们需要从GUI访问的C++类,并使用SWIG生成包含C++对象的普通旧java类.
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对象.我不会在这里详细介绍,但是一旦你克服了这个想法的最初震撼,它就不会非常复杂.
JNI
JNA
它们都是平台无关的.我更喜欢jna,因为它很容易弄乱jni代码.还有几种与平台相关的解决方案 - 但我不太了解它们.