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