不同编程语言的互相调用

在这里插入图片描述

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.xdnf.cn/news/146602.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CocosCreator 3.x 实现角色移动与加载时动态屏幕边缘检测

效果 思路 通过cc.view全局单例 View 对象获取屏幕尺寸加载时根据屏幕尺寸动态计算上下左右边缘 代码实现 import { _decorator, Component, EventTouch, Input, input, Node, view } from cc; const { ccclass, property } _decorator;/*** 玩家控制脚本*/ ccclass(Player…

探索AI编程新时代:GitHub Copilot如何重塑开发者工作效率

在当今技术瞬息万变的时代&#xff0c;软件开发者们每天都在努力寻找更高效的编程方法。面对繁忙的工作日程和不断增加的项目压力&#xff0c;如何在编码过程中大幅提升效率成为了一个备受关注的话题。在众多工具中&#xff0c;GitHub Copilot以其强大的AI驱动能力脱颖而出&…

二叉树的层序遍历(含八道leetcode相关题目)

文章目录 二叉树层序遍历模板102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值515. 在每个树行中找最大值429. N 叉树的层序遍历116. 填充每个节点的下一个右侧节点指针117. 填充每个节点的下一个右侧节点指针 II 二叉树层序遍历模板 …

基于Java springboot+mybatis 网上商城系统

基于Java springbootmybatis 网上商城系统 一、系统介绍二、功能展示1.主页(客户)2.登陆&#xff08;客户&#xff09;3.注册&#xff08;客户&#xff09;4.购物车(客户)5.我的订单&#xff08;客户&#xff09;6.用户管理&#xff08;管理员&#xff09;7.分类管理&#xff0…

Cisco 基础网络汇总

⭕个人主页 可惜已不在 ⭕可以分享给身边有需要的人 ⭕有用的话就留下一个三连吧 目录 前言: 一.网络及网络设备认识 二. 二层网络 三. 生成树、端口 四. 三层网络 五.访问控制 六.NAT 七.DHCP 八.PPP 九.帧中继 十.热备份 十一.综合实验 十二.WLAN 十三.Cisco P…

华为全联接大会HUAWEI Connect 2024印象(一):OpenEuler

因为和华为有课程合作&#xff0c;此次应邀参加了华为全联接大会 &#xff08;HUAWEI Connect 2024&#xff09;&#xff0c;分几次分享一下自己的见闻。 HUAWEI Connect 2024的规模很大&#xff0c;不过主要面向的应该是企业市场&#xff0c;我比较关注的嵌入式系统的内容很少…

OpenAI o1-preview和o1-mini现已在 GitHub Copilot和GitHub Models中提供

微软 GitHub 今天宣布在 GitHub Copilot和 Models 中提供两个新的 Open AI 模型&#xff1a;o1-preview 和 o1-mini。OpenAI 推出了新的 o1 系列 人工智能模型&#xff0c;旨在花更多时间思考后再做出反应。与以前的 OpenAI 模型相比&#xff0c;这些模型能在科学、编码和数学领…

C++速通LeetCode中等第18题-删除链表的倒数第N个结点(最简单含注释)

绝妙&#xff01;快慢指针法,快指针先走n步&#xff08;复杂度O(n),O(1))&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…

使命召唤游戏助手系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;玩家管理&#xff0c;游戏分类管理&#xff0c;道具种类管理&#xff0c;游戏道具处管理&#xff0c;战绩信息管理&#xff0c;水平评估管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统…

Spring源码-从源码层面讲解声明式事务的运行流程

TxTest开始执行事务方法: public class TxTest {public static void main(String[] args) throws SQLException {System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"d:\\code");ApplicationContext context new ClassPathXmlApplicationContext(&…

如何将生物序列tokenization为token?

原理讲解 tokenization是自然语言处理领域非常成熟的一项技术&#xff0c;tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。 在生物领域&#xff0c;如何把核苷酸或氨基酸序列tokenization成token呢&#xff1f; 我们可以使用k-mer技术&#xff1a; k-m…

基于 Qwen2-1.5B Lora 微调训练医疗问答任务

一、Qwen2 Lora 微调 Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。Qwen2 是 Qwen1.5 的重大升级。无论是语言模型还是多模态模型&#xff0c;均在大规模多语言和多模态数据上进行预训练&#xff0c;并通过高质量数据进行后期微调以贴近人类偏好。Qwen具…

DELPHI编译软件时带上当前IDE的版本号

如果通过 CompilerVersion 得到的也只是编译器的版本号。 比如&#xff1a;delphi XE12 是 36 &#xff0c;也仅此而己。 我想得到的是IDE的版本号&#xff0c;比如当前最新版本的DELPHI是&#xff1a;Embarcadero RAD Studio 12 Version 29.0.53571.9782 我想得到 29.0.53…

【JAVA开源】基于Vue和SpringBoot的网上超市系统

本文项目编号 T 037 &#xff0c;文末自助获取源码 \color{red}{T037&#xff0c;文末自助获取源码} T037&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

16【Protues51单片机仿真】智能洗衣机倒计时系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 用直流电机转动模拟洗衣机。要求 有弱洗、普通洗、强洗三种模式&#xff0c;可通过按键选择。可以设置洗衣时长&#xff0c;通关按键选择15、30、45、60、90分钟。时间到蜂鸣器报警提示。LCD 显示…

Webui 显卡有显存,会报错:CUDA out of memory

Webui 显卡明明有显存&#xff0c;会报错&#xff1a;CUDA out of memory 网上找了很多资料&#xff0c;都没有能解决这个问题 &#xff0c;后来发现和电脑虚拟内存设置有关&#xff0c;这里记录一下具体的解决方法&#xff1a; 什么是 CUDA Out of Memory 错误&#xff1f; …

SAP B1 Web Client MS Teams App集成连载三

过程/Procedure&#xff1a; 1.在应用商店中&#xff0c;点击启动 SAP Business One 应用。应用详细信息页面显示如下。 In the Apps store, click SAP Business One app to launch it. The app details page is displayed as below 2.在左上角&#xff0c;有一个包含两个选项的…

淘宝扭蛋机小程序,扭蛋机文化下的新体验

在数字化时代中&#xff0c;扭蛋机逐渐从传统的线下机器转移到了线上互联网中&#xff0c;市场得到了创新发展。扭蛋机小程序具有便捷、多样化、个性化的特点&#xff0c;迎合了当下消费者的线上消费习惯&#xff0c;又能够让扭蛋机玩家体验到新鲜有趣的扭蛋。 扭蛋机是一种热…

光伏板缺陷红外检测数据集

光伏板缺陷红外检测数据集 包含以下4个数据文件&#xff1a; /train&#xff1a;训练集 /valid&#xff1a;验证集 /test&#xff1a;测试集 README.txt&#xff1a;数据说明 【数据说明】检测目标以Pascal VOC格式进行标注&#xff0c;对每个图像进行以下预处理&#xff0c;统…

PCIE集成验证(五)MSI/MSI-X中断

PCI 总线最早采用的中断机制是 INTx&#xff0c;这是基于边带信号的。后续的 PCI/PCI-X版本&#xff0c;为了消除边带信号&#xff0c;降低系统的硬件设计复杂度&#xff0c;逐渐采用了 MSI(Message Signaled Interrupt)/MSI-X&#xff08;消息信号中断&#xff09;的中断机制。…