当前位置: 首页 > news >正文

不同编程语言的互相调用

在这里插入图片描述

C语言与Python

步骤:

  1. 编写C代码 (hello_c.c):

    #include <stdio.h>void printHello(const char *name) {printf("Hello, %s!\n", name);
    }
    
  2. 编译C代码为共享库:

    gcc -shared -o hello_c.so hello_c.c
    
  3. 编写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")
    
  4. 运行Python脚本:

    python hello_c_py.py
    

    输出:

    Hello, Python!
    

说明:

  • 使用 ctypes.CDLL 来加载动态链接库。
  • 使用 argtypes 设置函数参数类型,确保参数正确传递。
C语言与Java

步骤:

  1. 编写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);
    }
    
  2. 生成JNI头文件:

    javah -jni HelloJNI
    

    生成 HelloJNI.h 文件。

  3. 编译C代码为动态库:

    gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -shared -o libHelloJNI.so HelloJNI.c
    
  4. 编写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");}
    }
    
  5. 编译并运行Java代码:

    javac HelloJNI.java
    java HelloJNI
    

    输出:

    Hello, Java!
    

说明:

  • 使用 System.loadLibrary 加载动态库。
  • 使用 native 关键字声明本地方法,并在C代码中实现。
C语言与JavaScript

步骤:

  1. 编写C代码 (hello_c.c):

    #include <stdio.h>void printHello(const char *name) {printf("Hello, %s!\n", name);
    }
    
  2. 编译C代码为Node.js模块:

    gcc -shared -o hello_c.node hello_c.c
    
  3. 编写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');
    
  4. 安装必要的Node.js模块:

    npm install ffi-napi ref-napi
    
  5. 运行Node.js脚本:

    node hello_c_js.js
    

    输出:

    Hello, JS!
    

说明:

  • 使用 ffi-napiref-napi 模块来调用C函数。
  • 使用 ffi.Library 加载动态库,并定义函数签名。

C++与其它语言的互操作

C++与Python

步骤:

  1. 编写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.");
    }
    
  2. 编译C++代码为共享库:

    g++ -std=c++11 -shared -o hello_cpp.so hello_cpp.cpp -fPIC -I/path/to/pybind11/include
    
  3. 编写Python代码 (hello_cpp_py.py):

    import hello_cpphello_cpp.printHello('Python')
    
  4. 运行Python脚本:

    python hello_cpp_py.py
    

    输出:

    Hello, Python!
    

说明:

  • 使用 pybind11 库来绑定C++代码到Python。
  • 使用 m.def 来定义C++函数的Python接口。
C++与Java

步骤:

  1. 编写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);}
    }
    
  2. 生成JNI头文件:

    javah -jni HelloJNI
    

    生成 HelloJNI.h 文件。

  3. 编译C++代码为动态库:

    g++ -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -shared -o libHelloJNI.so HelloJNI.cpp
    
  4. 编写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");}
    }
    
  5. 编译并运行Java代码:

    javac HelloJNI.java
    java HelloJNI
    

    输出:

    Hello, Java!
    

说明:

  • 使用 JNIEXPORTJNIEnv 接口来定义JNI函数。
  • 使用 jstring 类型来传递字符串。

Java与其它语言的互操作

Java与Python

步骤:

  1. 编写Python代码 (hello_py.py):

    def printHello(name):print("Hello, " + name + "!")
    
  2. 编写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\")");}
    }
    
  3. 编译并运行Java代码:

    javac HelloPy.java
    java HelloPy
    

    输出:

    Hello, Java!
    

说明:

  • 使用 Jep 库来启动Python解释器并执行Python代码。
  • 使用 eval 方法来执行Python语句。
Java与C#

步骤:

  1. 编写C#代码 (HelloCS.cs):

    using System;public class HelloCS {public static void PrintHello(string name) {Console.WriteLine($"Hello, {name}!");}
    }
    
  2. 编译C#代码为DLL:

    csc /target:library /out:HelloCS.dll HelloCS.cs
    
  3. 编写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");}
    }
    
  4. 编译并运行Java代码:

    javac HelloCS.java
    java HelloCS
    

    输出:

    Hello, Java!
    

说明:

  • 使用 JNBridge 库来调用C#代码。
  • 使用 NativeLibrary.addSearchPathClassLibrary.load 来加载C#库。

C#与其它语言的互操作

C#与Python

步骤:

  1. 编写Python代码 (hello_py.py):

    import clr
    clr.AddReference("System.Core")
    from System import ConsoleConsole.WriteLine("Hello, Python!")
    
  2. 编写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);}
    }
    
  3. 编译并运行C#代码:

    csc /target:exe /out:HelloPy.exe HelloPy.cs
    mono HelloPy.exe
    

    输出:

    Hello, Python!
    

说明:

  • 使用 IronPython.Hosting 来启动Python解释器并执行Python代码。
  • 使用 ExecuteFile 方法来执行Python脚本。
C#与JavaScript

步骤:

  1. 编写JavaScript代码 (hello_js.js):

    export function printHello(name) {console.log(`Hello, ${name}!`);
    }
    
  2. 编写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();}
    }
    
  3. 编译并运行C#代码:

    dotnet run
    

    输出:

    Hello, C#! (在控制台输出)
    

说明:

  • 使用 Microsoft.JSInterop 库来调用JavaScript代码。
  • 使用 InvokeAsync 方法来执行JavaScript函数。

总结

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


http://www.mrgr.cn/news/33219.html

相关文章:

  • js 一个数组合并到一个数组
  • 群晖套娃:群晖+飞牛fnOS二合一,群晖nas安装飞牛fnOS系统实录(飞牛fnOS初体验,如何挂载网盘视频,轻松实现影视刮削)
  • PHP项目中Vendor错误导致项目失败的解决方案
  • 检索索引对象中的重复值、删除重复值pandas.Index.duplicated
  • Python 3 元组
  • python画图1
  • CocosCreator 3.x 实现角色移动与加载时动态屏幕边缘检测
  • 嵌入式 开发技巧和经验分享
  • PHP如何从字符串中删除转义字符
  • 【C++】仿函数
  • 未来视界,触手可及:bigmp4 引领 AI 视频处理新革命
  • 教师师生关系研判:基于信任建立、课堂管理、学生心理支持、沟通技巧与反馈改进的综合分析
  • 嵌入式常用GUI介绍
  • 用Python实现时间序列模型实战——Day 30: 学习总结与未来规划
  • NXP实战笔记(十六):NXP 32K3xx系列单片机有关OTA升级的思考
  • 某省公共资源交易电子平台爬虫逆向
  • 2024年研赛 C、D、F三题论文首发+部分代码分享
  • CSS3 多媒体查询
  • 【保奖思路】2024年华为杯研赛B题完整代码建模过程(后续会更新)
  • 医院伤员消费点餐限制———未来之窗行业应用跨平台架构