【发布时间】:2012-03-15 16:56:37
【问题描述】:
一个典型的 C 程序将被编译、汇编、链接和加载。我知道 Java 与 JVM 一起工作并产生字节码。是否可以使用链接器连接两个“目标文件”?例如,一个 C 程序和一个 C++ 程序可以通过使用链接器并链接两个目标文件来一起使用。
C 和 Java 之间可以做同样的事情吗?
【问题讨论】:
标签: java c gcc compiler-construction linker
一个典型的 C 程序将被编译、汇编、链接和加载。我知道 Java 与 JVM 一起工作并产生字节码。是否可以使用链接器连接两个“目标文件”?例如,一个 C 程序和一个 C++ 程序可以通过使用链接器并链接两个目标文件来一起使用。
C 和 Java 之间可以做同样的事情吗?
【问题讨论】:
标签: java c gcc compiler-construction linker
您不能直接将已编译的 C 代码与已编译的 Java 代码链接。
您可以使用 Java Native Interface (JNI) 从 Java 调用已编译的 C 或 C++ 代码:
Java 本机接口 (JNI) 可以将用 Java 编程语言编写的代码与用 C 和 C++ 等其他语言编写的代码集成在一起。它允许程序员充分利用 Java 平台,而不必放弃对遗留代码的投资。
【讨论】:
如果您将 C 代码编译为 JVM 字节码而不是本机代码,这可能是可能的,因此您将在 JVM 级别“链接”,而不是通过本机对象链接器。
见http://en.wikipedia.org/wiki/Java_virtual_machine#C_to_bytecode_compilers
【讨论】:
不,至少不使用任何常用工具。 javac 生成的“目标文件”(非正式地)称为“字节码”,是堆栈机器程序的硬件独立表示(与旧 "P-Code" 系统使用的程序没有太大区别)。
有各种工具可以将 Java 字节码转换为适用于各种硬件架构的可执行文件,但都相当专业——据我所知,没有一个工具可以产生可链接的模块。
【讨论】:
GCC可以将Java编译成类文件,然后编译成可执行的汇编代码using gcj
AFAIK,直接将 Java 和 C 结合起来没有用,但机器代码最终必须采用普通链接器可以理解的形式。您可能需要一些汇编胶水代码才能在两者之间调用。
【讨论】: