似乎大多数与JNI(Java本地接口)相关的文档或帮助程序库都与从Java调用本地代码有关。这似乎是它的主要用途,即使它有更多的功能。寻找一种方便的方式从C++调用Java
我想主要是在相反的方向工作:修改一个现有的(相当大的)可移植的C++程序,通过向它添加一些Java库。例如,我想让它通过JDBC调用数据库,或者通过JMS调用消息队列系统,或者发送电子邮件,或者调用我自己的Java类等。但是对于原始的JNI,这非常不愉快并且容易出错。
所以我最好喜欢编写可以调用Java类的C++代码,就像C++/CLI可以调用CLR类一样容易。喜欢的东西:
这样,我就不会去manually do the work of getting the method ID by passing the name and the weird signature strings,并会从调用方法所造成的未检查的API编程错误保护。实际上它看起来很像是等效的Java。
注:我还在谈论使用JNI!作为一项基础技术,它非常适合我的需求。它“在进行中”并且高效。我不想在单独的进程中运行Java并对其进行RPC调用。 JNI本身很好。我只是想要一个愉快的界面。
必须有一个代码生成工具才能使等价的C++类,名称空间,方法等完全匹配我指定的一组Java类所公开的内容。生成的C++类将会:
- 有成员函数接受它们的参数的类似包装版本,然后执行必要的JNI voodoo来进行调用。
- 以相同的方式包装返回值,以便以自然方式链接调用。
- 维护方法ID的每类静态缓存,以避免每次都查找它们。
- 完全是线程安全的,便携式的,开源的。
- 在每次方法调用后自动检查异常并生成std C++异常。
- 当我以通常的JNI方式编写本机方法时也适用,但我需要调用其他Java代码。
- 该数组应该在原始类型和类之间完全一致地工作。
- 毫无疑问,当它们需要在局部参考框架之外生存时,需要像全局一样来包装引用 - 再次,对于所有数组/对象引用应该都是相同的。
这样一个免费的,开源的,可移植的库/工具是否存在或我在做梦?
注:我发现this existing question,但在这种情况下,OP远没有完美的苛求,因为我是...
更新:关于SWIG评论使我this previous question,这似乎表明它主要是相反的方向,所以不会做我想要的。
重要
- 这是关于能够编写C++代码,操纵Java类和对象,而不是倒过来(见标题!)
- 我已经知道JNI存在( )但是对JNI API的手写代码不必要的冗长,重复,容易出错,不会在编译时进行类型检查等。如果您想要缓存方法ID和类对象,那么它更加冗长。我想自动生成C++包装类,为我处理所有这些。
更新:我开始了我自己的解决方案的工作:
https://github.com/danielearwicker/cppjvm
如果已经存在,请让我知道!
NB。如果你正在考虑在你自己的项目中使用它,请随时留意,但请记住,现在代码已经过了几个小时了,到目前为止我只写了三个非常艰难的测试。
虽然我只用它用于C和Python ...一个很长的时间以前,还有[SWIG](http://www.swig.org/Doc1.3/Java.html)。 – 2011-09-24 08:52:24
查看更新:SWIG显然不会这样做。 –
你想在哪个编译器/解释器执行你的程序,C还是Java?如果是Java,那么使用JNI是不可能的。 – Naved