不同编程语言的互相调用

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