从C++/Java/C#代码中调用C方法?

8
今天的许多编程语言都是基于 C 的,例如 C++、C#、Java 和 Objective-C。那么我能否从 C++ 代码中调用一个 C 方法?或者在 Java 或 C# 中调用 C?或者这个目标是不可实现和不合理的?请为我和其他人提供一个快速的代码示例以便理解。
以下是一个示例:
```c++ // C code int add(int a, int b) { return a + b; }
// C++ code calling the C function extern "C" { int add(int, int); }
int main() { int result = add(2, 3); // result will be 5 return 0; } ```
在 C++ 中,你可以通过使用 `extern "C"` 来声明一个 C 函数,并且可以像在 C 中一样进行调用。同样的方法也适用于 Java 和 C#。

“…是基于C的;例如…C#,Java…” -- 是吗?我认为这仅限于在这些情况下使用花括号和分号。 - sellibitze
同意,语法相似并不意味着它们基于C,即使它们可能是(或可能已经是)C++;C没有方法。C++和Objective-C可以调用C函数并链接到由C编写的库而没有问题。 - ShinTakezou
5个回答

5

它能否从刚编译的C代码中调用C例程?还是C代码必须在库中? - Mohit Deshpande
C++和Objective-C都可以编译C语言,因为它们都是扩展集。而C#和Java需要在库中存在C代码。 - Alan
这篇关于Java的文章并不是关于从Java调用C,而是关于从C调用Java。 - ManBugra

2

以下是从C++调用C函数的示例。将此C函数保存在名为a.c的文件中:

int f() {
   return 42;
}

并编译它:

gcc -c a.c

这将产生一个名为a.o的文件。现在,在名为main.cpp的文件中编写一个C++程序:

#include <iostream>
extern "C" int f();

int main() {
   std::cout << f() << std::endl;
}

编译并链接使用以下命令:

g++ main.cpp a.o -o myprog

这将生成一个名为myprog的可执行文件,运行时会打印出42。


1

在Java中调用C方法...

有一个关键字"native",您可以在其中编写与机器相关的C代码,并从Java中调用它...

基本上它会创建一个DLL文件..然后您必须在程序中加载它...

这里有一个不错的例子here....


0

从Java调用C方法有多种选择,包括:

  • JNA - Java Native Access。免费。易于使用。手动声明Java类和接口,与现有的C结构和函数相对应。每次调用比JNI慢几百纳秒。
  • JNI - Java Native Interface。免费。最快的选项。需要在您的Java代码和要调用的本地函数之间添加本地粘合代码层。
  • JNIWrapper - 商业产品,类似于JNA。

0

如果想要从Java中调用C/C++,可以看一下BridJ(它类似于JNA,但性能更好)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接