嘿,我以为即使迟到,我也会输入我的答案。 我认为首先要考虑一些重要的事情,你希望有多强大的java和python之间的链接。
首先,您是否只想调用函数或者您是否真的想要python代码来更改java对象中的数据? 这是非常重要的。 如果您只想调用带或不带参数的python代码,那么这并不是很困难。 如果你的参数是原始的,那就更容易了。 但是如果你想在python中有java类实现成员函数,这会改变java对象的数据,那么这不是那么容易或直截了当。
其次我们是在谈论cpython还是会jython呢? 我会说cpython就是它的所在! 我主张这就是为什么python如此酷! 有这么高的抽象但是在需要时可以访问c,c ++。 想象一下,如果你能在java中拥有它。 这个问题甚至不值得问,如果jython是好的,因为无论如何它很容易。
所以我使用了以下方法,并将它们从易到难的列出:
Java到Jython
优点:轻松简单。 有对java对象的实际引用
缺点:没有CPython,非常慢!
来自java的Jython非常简单,如果这真的足够那么好。 然而它非常慢,没有cpython! 如果没有cpython,生活是否值得生活我不这么认为! 您可以轻松地使用python代码为您的java对象实现您的成员函数。
通过Pyro从Jython到CPython的Java
Pyro是python的远程对象模块。 你在cpython解释器上有一些对象,你可以发送它通过序列化传输的对象,它也可以通过这种方法返回对象。 请注意,如果从jython发送序列化的python对象,然后调用一些更改其成员中的数据的函数,那么您将不会在java中看到这些更改。 您只需要记住从pyro发回您想要的数据。 我相信这是进入cpython的最简单方法! 你不需要任何jni或jna或swig或....你不需要知道任何c或c ++。 嗯嗯?
优点:访问cpython,不像以下方法那么困难
缺点:无法直接从python更改java对象的成员数据。 有点间接,(jython是中间人)。
Java到C / C ++通过嵌入式解释器通过JNI / JNA / SWIG到Python(也许使用BOOST库?)
OMG这种方法不适合胆小的人。而且我可以告诉你,用一种不错的方法实现这一目标需要很长时间。你想要这样做的主要原因是你可以运行cpython代码,它完全控制你的java对象。在决定尝试使用python(就像一匹马)来尝试和java(就像一只黑猩猩)一样,需要考虑一些重要的事情。首先,如果你让翻译失败,你的节目就会熄灯!并没有让我开始处理并发问题!此外,还有分配锅炉,我相信我找到了最好的配置,以尽量减少这个锅炉,但它仍然是分配!那么如何解决这个问题:考虑到C ++是你的中间人,你的对象实际上是c ++对象!好,你现在知道了。只需将您的对象编写为cpp中的程序,而不是使用您希望从两个世界访问的数据。然后你可以使用名为swig的包装器生成器([http://www.swig.org/Doc1.3/Java.html)]使java可以访问它并编译一个你称之为System.load的dll(这里的dll名称) )在java中。首先让这个工作,然后继续努力!要进入python,您需要嵌入一个解释器。首先,我建议做一些hello解释程序或本教程在C / C中嵌入python。一旦你有了工作,就有时间让马和猴子跳舞!您可以通过[boost] [3]将c ++对象发送给python。我知道我没有给你鱼,只是告诉你在哪里找到鱼。编译时需要注意的一些指示。
编译boost时,需要编译共享库。 你需要在jdk中包含和链接你需要的东西,即jawt.lib,jvm.lib,(启动应用程序时你的路径中还需要客户端jvm.dll)以及python27.lib或者 无论如何以及boost_python-vc100-mt-1_55.lib。然后包括Python / include,jdk / include,boost和仅使用共享库(dll),否则boost有一个teary。 我知道,是的。 有很多方法可以解决这个问题。 因此,请确保逐块完成每件事。 然后把它们放在一起。