有人成功地将C++ API封装在Java或.NET中吗?我有一个应用程序,提供了一个用于编写插件的C++ API。我想要做的是从.NET或Java访问该API。
我需要使用COM吗,还是有更简单/更好的选择?
在Java方面,这里有很多选择.. this question实际上非常接近您所寻找的,只要您的API可以被封装在DLL、com或activex对象中。
我个人使用了JIntegra来包装对办公室(Word)的API调用,并直接在Java中使用它。虽然需要一些修改才能获得所需的功能,但我们最终还是让它工作了。实际上,调整是在Word方面进行的,而实际集成相对容易。
我维护的软件是用C++实现的,但必须具有多种语言的接口,包括Java和.NET,还包括Delphi和VB6。此外,它必须在多个平台上运行(因此Java需要在Unix上运行)。
完成这项工作的方法是使用单个DLL导出使用原始类型的纯C函数。例如,给定一个类Foo:
long MY_EXPORT_FLAG FooCreate()
{
return (long)new Foo();
}
void MY_EXPORT_FLAG FooDestroy(long Handle)
{
delete (Foo*)Handle;
}
void MY_EXPORT_FLAG BarMethod(long Handle, const char* pStr1, long* pReturnValue)
{
*pReturnValue = ((Foo*)Handle)->BarMethod( pStr1 );
}
然后你的JNI/.NET/VB6/Delphi代码实现了特定语言的类包装器,但是调用这些C dll函数。每个类包装器都会包含一个句柄,并将其传递给C函数。
这种方法非常有效,因为大多数语言倾向于使用C作为最低公共分母,只要您可以通过薄的C api导出接口,就可以为其他语言构建接口。
我们在DLL中导出C(而不是C ++)api,因为函数签名在各个平台上更加标准化。
不要忘记,在C#和Java中,您将不得不处理多字节字符串编码,因此您应该弄清楚如何将字符串转换为/从C ++代码进行转码。这通常涉及了解区域设置,或者您可以采用廉价的方式,仅支持UTF-8。
我是SlimDX的首席作者。它可能不是最大的开源互操作性项目,但在整个项目中有150K+行代码,相当可观。它使用C++/CLI编写,这是一种由微软开发的语言,与C++基本兼容,旨在允许您构建包装器。它非常好用,但需要注意的是它仅适用于Windows系统。Mono将无法使用它。我不知道这对您来说是否是一个问题,但它可能比COM更好。不幸的是,有很多技巧和诀窍,你基本上必须自己想出来。我打算写一篇关于我们在SlimDX中使用的许多技巧和诀窍的博客文章,但不知怎么的,我总是没能完成。
在Java方面,我认为你必须使用JNI。祝你好运。我从未听说过任何一个人使用JNI而没有我们两个都会以一种糟糕的“哎呀那很疼”的方式笑出声来。