
C语言与Python
步骤:
-
编写C代码 (
hello_c.c):#include <stdio.h> void printHello(const char *name) { printf("Hello, %s!\n", name); } -
编译C代码为共享库:
gcc -shared -o hello_c.so hello_c.c -
编写Python代码 (
hello_c_py.py):import ctypes # 加载C库 lib = ctypes.CDLL("./hello_c.so") # 设置函数参数类型 lib.printHello.argtypes = [ctypes.c_char_p] # 调用C函数 lib.printHello(b"Python") -
运行Python脚本:
python hello_c_py.py输出:
Hello, Python!
说明:
- 使用
ctypes.CDLL来加载动态链接库。 - 使用
argtypes设置函数参数类型,确保参数正确传递。
C语言与Java
步骤:
-
编写C代码 (
HelloJNI.c):#include <jni.h> #include <stdio.h> JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj, jstring name) { const char *cname = (*env)->GetStringUTFChars(env, name, NULL); printf("Hello, %s!\n", cname); (*env)->ReleaseStringUTFChars(env, name, cname); } -
生成JNI头文件:
javah -jni HelloJNI生成
HelloJNI.h文件。 -
编译C代码为动态库:
gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -shared -o libHelloJNI.so HelloJNI.c -
编写Java代码 (
HelloJNI.java):public class HelloJNI { static { System.loadLibrary("HelloJNI"); } public static native void printHello(String name); public static void main(String[] args) { printHello("Java"); } } -
编译并运行Java代码:
javac HelloJNI.java java HelloJNI输出:
Hello, Java!
说明:
- 使用
System.loadLibrary加载动态库。 - 使用
native关键字声明本地方法,并在C代码中实现。
C语言与JavaScript
步骤:
-
编写C代码 (
hello_c.c):#include <stdio.h> void printHello(const char *name) { printf("Hello, %s!\n", name); } -
编译C代码为Node.js模块:
gcc -shared -o hello_c.node hello_c.c -
编写Node.js代码 (
hello_c_js.js):const ffi = require('ffi-napi'); const ref = require('ref-napi'); const lib = ffi.Library('./hello_c', { 'printHello': ['void', [ref.types.CString]] }); lib.printHello('JS'); -
安装必要的Node.js模块:
npm install ffi-napi ref-napi -
运行Node.js脚本:
node hello_c_js.js输出:
Hello, JS!
说明:
- 使用
ffi-napi和ref-napi模块来调用C函数。 - 使用
ffi.Library加载动态库,并定义函数签名。
C++与其它语言的互操作
C++与Python
步骤:
-
编写C++代码 (
hello_cpp.cpp):#include <pybind11/pybind11.h> void printHello(std::string name) { std::cout << "Hello, " << name << "!" << std::endl; } PYBIND11_MODULE(hello_cpp, m) { m.def("printHello", &printHello, "A function which prints a message."); } -
编译C++代码为共享库:
g++ -std=c++11 -shared -o hello_cpp.so hello_cpp.cpp -fPIC -I/path/to/pybind11/include -
编写Python代码 (
hello_cpp_py.py):import hello_cpp hello_cpp.printHello('Python') -
运行Python脚本:
python hello_cpp_py.py输出:
Hello, Python!
说明:
- 使用
pybind11库来绑定C++代码到Python。 - 使用
m.def来定义C++函数的Python接口。
C++与Java
步骤:
-
编写C++代码 (
HelloJNI.cpp):#include <jni.h> #include <iostream> extern "C" { JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj, jstring name) { const char *cname = env->GetStringUTFChars(name, nullptr); std::cout << "Hello, " << cname << "!" << std::endl; env->ReleaseStringUTFChars(name, cname); } } -
生成JNI头文件:
javah -jni HelloJNI生成
HelloJNI.h文件。 -
编译C++代码为动态库:
g++ -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -shared -o libHelloJNI.so HelloJNI.cpp -
编写Java代码 (
HelloJNI.java):public class HelloJNI { static { System.loadLibrary("HelloJNI"); } public static native void printHello(String name); public static void main(String[] args) { printHello("Java"); } } -
编译并运行Java代码:
javac HelloJNI.java java HelloJNI输出:
Hello, Java!
说明:
- 使用
JNIEXPORT和JNIEnv接口来定义JNI函数。 - 使用
jstring类型来传递字符串。
Java与其它语言的互操作
Java与Python
步骤:
-
编写Python代码 (
hello_py.py):def printHello(name): print("Hello, " + name + "!") -
编写Java代码 (
HelloPy.java):import org.python.util.PyScriptEngineManager; import org.python.util.PyScriptEngine; public class HelloPy { public static void main(String[] args) { PyScriptEngineManager manager = new PyScriptEngineManager(); PyScriptEngine engine = manager.getEngine(); engine.eval("import hello_py"); engine.eval("hello_py.printHello(\"Java\")"); } } -
编译并运行Java代码:
javac HelloPy.java java HelloPy输出:
Hello, Java!
说明:
- 使用
Jep库来启动Python解释器并执行Python代码。 - 使用
eval方法来执行Python语句。
Java与C#
步骤:
-
编写C#代码 (
HelloCS.cs):using System; public class HelloCS { public static void PrintHello(string name) { Console.WriteLine($"Hello, {name}!"); } } -
编译C#代码为DLL:
csc /target:library /out:HelloCS.dll HelloCS.cs -
编写Java代码 (
HelloCS.java):import com.jnbridge.jni.*; public class HelloCS { static { JNIRuntime.registerJavaTypes(HelloCS.class); } public static void main(String[] args) { NativeLibrary.addSearchPath("HelloCS", "."); ClassLibrary.load("HelloCS"); Class clazz = Class.forName("HelloCS"); Method method = clazz.getMethod("PrintHello", String.class); method.invoke(null, "Java"); } } -
编译并运行Java代码:
javac HelloCS.java java HelloCS输出:
Hello, Java!
说明:
- 使用
JNBridge库来调用C#代码。 - 使用
NativeLibrary.addSearchPath和ClassLibrary.load来加载C#库。
C#与其它语言的互操作
C#与Python
步骤:
-
编写Python代码 (
hello_py.py):import clr clr.AddReference("System.Core") from System import Console Console.WriteLine("Hello, Python!") -
编写C#代码 (
HelloPy.cs):using IronPython.Hosting; using Microsoft.Scripting.Hosting; class HelloPy { static void Main() { ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = engine.CreateScope(); engine.ExecuteFile("hello_py.py", scope); } } -
编译并运行C#代码:
csc /target:exe /out:HelloPy.exe HelloPy.cs mono HelloPy.exe输出:
Hello, Python!
说明:
- 使用
IronPython.Hosting来启动Python解释器并执行Python代码。 - 使用
ExecuteFile方法来执行Python脚本。
C#与JavaScript
步骤:
-
编写JavaScript代码 (
hello_js.js):export function printHello(name) { console.log(`Hello, ${name}!`); } -
编写C#代码 (
HelloJS.cs):using System; using System.IO; using Microsoft.JSInterop; public class HelloJS { public static void Main() { var jsRuntime = new DefaultJSRuntime(); jsRuntime.Invoke<object>("import", "./hello_js.js").Wait(); jsRuntime.InvokeAsync<object>("printHello", "C#").Wait(); } } -
编译并运行C#代码:
dotnet run输出:
Hello, C#! (在控制台输出)
说明:
- 使用
Microsoft.JSInterop库来调用JavaScript代码。 - 使用
InvokeAsync方法来执行JavaScript函数。
总结
以上是详细的示例代码和步骤,展示了如何在不同编程语言之间实现互操作。每种语言之间的互操作都有其特定的方法和工具,希望这些示例能够帮助你更好地理解和实现跨语言调用。














![[Vue] 从零开始使用 Vite 创建 Vue 项目](https://i-blog.csdnimg.cn/direct/3d0305a596774b6fa356fdcdd3beb78b.png)




