4 回答
TA贡献1909条经验 获得超7个赞
为什么不使用Jython?我唯一能想到的缺点就是您的库是否使用CPython本机扩展。
编辑:如果您现在可以使用Jython,但认为您可能在库的更高版本中遇到问题,建议您尝试将库与应用程序隔离(例如某种适配器接口)。选择目前最简单的方法,然后在需要时考虑使用JNI / CPython / etc。除非确实需要,否则通过(痛苦的)JNI路线几乎无济于事。
TA贡献1798条经验 获得超3个赞
坦白说,大多数直接从JVM内部运行Python的方法都行不通。它们要么不完全兼容(您的第三方库的新版本可以使用python 2.6功能,并且不能与Jython 2.5一起使用),要么它们很hacky(它将与隐秘的JVM stacktrace断开,并不会真正导致解决方案)。
我首选的将两者集成的方法是使用RPC。如果数据量适中,那么XML RPC在这里不是一个不错的选择。它得到了很好的支持-Python在其标准库中提供了它。Java库也很容易找到。现在,根据您的设置,Java或Python部分将是接受来自其他语言的连接的服务器。
Google protobuffers是一种较不流行但值得考虑的替代方法,它是Google protobuffers,它对rpc有2/3的支持。您只需要提供您的传输层。没有那么多的工作和写作的便利是合理的。
另一个选择是围绕需要公开给Java并通过JVM本机插件使用的那部分Python功能编写一个C包装器。您可以通过使用SWIG SWIG减轻痛苦 。
从本质上来说,它的工作原理如下:
为从Java到C ++的所有方法调用创建一个SWIG接口。
创建将接收您的调用的C / C ++代码,并使用正确的参数在内部调用python解释器。
转换从python获得的响应,并通过swig发送回Java代码。
该解决方案相当复杂,在大多数情况下有点过头了。如果您(出于某种原因)买不起RPC,仍然值得做。不过,RPC仍然是我的首选。
TA贡献2065条经验 获得超14个赞
我的另一个想法是使用JNI与Python的C绑定进行通信。
我非常喜欢JNA:
JNA使Java程序无需编写Java代码即可轻松访问本机共享库(Windows上的DLL),而无需编写Java代码-无需JNI或本机代码。此功能可与Windows的Platform / Invoke和Python的ctype相媲美。访问在运行时是动态的,无需代码生成。
我的0.02 $ :)
TA贡献1785条经验 获得超4个赞
您可以使用ActiveMQ之类的消息传递服务。它同时具有Python和Java支持。这样,您可以保留复杂的JNI或C绑定,而仅处理我认为简单的接口。此外,当库更新时,您无需进行太多更改(如果有的话)。
添加回答
举报