在 C/C++ 中访问 Java/Python 的动态链接库?

Posted

技术标签:

【中文标题】在 C/C++ 中访问 Java/Python 的动态链接库?【英文标题】:Dynamic Link Library for Java/Python to access in C/C++? 【发布时间】:2014-01-16 19:58:10 【问题描述】:

一个看似不寻常的快速问题。 (反向)

而不是从解释语言调用本机代码;有没有办法将 Java 或 Python 代码编译为 .dll/.so 并从 C/C++ 调用代码?

我什至愿意接受诸如手动生成解释器或 JVM 并强制它读取 .class/.py 文件的答案。 (这是一个好的解决方案吗?)

谢谢。

【问题讨论】:

您为什么要这样做?有很多选择,但如果不知道您要做什么,就很难知道哪一个对您有意义。 我的 C++ 网络系统的某些部分对性能不是那么关键,但它们需要大量的高级抽象。所以我决定用一种更快(在开发方面)的语言分别编写它们。 通常,网络系统中对性能至关重要的唯一部分是核心网络环路。像geventasynciotwisted 等 Python 库通常比你用 C++ 编写的任何东西都快(以及跨平台、更少错误、更易于使用等),所以根本没有理由使用 C++。当然,如果您在套接字多路复用之外还有其他受 CPU 限制或需要核心并行性或与没有绑定的第三方 C 库通信的其他事情,您可以用 C++ 编写 它们,但是将这些部分组织成扩展模块通常很容易。 对不起,我有点粗体,但我认为 Python 库或任何其他语言/库都无法提供与 Winsock 和 C 的 IOCP 相同的速度或灵活性;/ 这些库的核心部分是用高度优化的、特定于平台的 C 代码编写的,然后向 Python 公开一个简单的 API 以在其之上构建您的应用程序。如果您有一个网络编码专家团队构建单平台流服务器,并且优化可扩展性是您项目的核心目标,那么是的,您显然可以击败这样的库。如果你是一个知道如何编写像样的 IOCP 应用程序的人,那么你就不会这样做。 【参考方案1】:

gcj 可以将大多数 Java 源代码编译为本机代码(与 libgcj 共享库链接)而不是 JVM 字节码。

有许多类似的 Python 项目,例如 shedskin,但没有一个是成熟或活跃的。

Cython 类似,但不完全相同——它将用类似 Python 的语言编写的模块编译为 CPython 的原生 C 扩展模块。但是如果你把它和embedding Python in a C app 放在一起,它会给你大部分你想要的东西。但是您仍然在运行 Python 解释器循环来将所有这些编译为 C 的函数联系在一起。

您也可以用 Java 做同样的事情——将 JVM 嵌入到您的应用程序中,使用 gcj 将您想要的任何部分编译为本机代码,同时将其他部分编译为字节码,并使用 JNI 在它们之间进行通信.

当然,您可以使用Jython 将您的 Python 代码嵌入到 JVM 中,您可以将其嵌入到您的 C 程序中,并且因为您可以直接从 Jython 使用 JNI,所以这三种语言中的任何一种都可以有效地相互通信其他没有经过第三个。

将 JVM 或 CPython 解释器作为子进程生成的想法(我认为您在问题中提出的建议)也很好用。但是,在这种情况下,您必须使用的唯一接口是子进程的 stdin/stdout/stderr(或您手动创建的任何管道或套接字),它不像能够直接在对象上调用方法那样灵活,等等(再说一次,有时这种额外的间接性可能是件好事,它会迫使您在组件之间定义一个完全分离的 API。)

【讨论】:

一定会考虑您的回答并查看这些链接 - 谢谢。【参考方案2】:

您可以在 C/C++ 程序中嵌入 Python 解释器。

http://docs.python.org/2/extending/embedding.html

使用 Java,您可能需要 Java 原生接口(双向工作)。

http://en.wikipedia.org/wiki/Java_Native_Interface

【讨论】:

【参考方案3】:

您还可以查看 Lua,虽然它不像许多其他脚本语言那样广泛使用,但它可以轻松嵌入到可执行文件中。它相对较小且速度较快。只是另一种选择。如果您想从您的 c/c++ 调用其他语言,请查看 SWIG。

【讨论】:

以上是关于在 C/C++ 中访问 Java/Python 的动态链接库?的主要内容,如果未能解决你的问题,请参考以下文章

简单的Java,Python,C,C++

从其他语言(如 Java、PHP、Perl、Python 等)调用 C/C++ 代码的最佳方法是啥?

V语言横空出世,C/C++/Java/Python/Go地位不保

项目展示

项目展示

访问大型 C/C++ 项目中的现有字段