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函数。
总结
以上是详细的示例代码和步骤,展示了如何在不同编程语言之间实现互操作。每种语言之间的互操作都有其特定的方法和工具,希望这些示例能够帮助你更好地理解和实现跨语言调用。