不同编程语言的互相调用

news2024/9/22 10:14:44

在这里插入图片描述

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_cpp
    
    hello_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 Console
    
    Console.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.coloradmin.cn/o/2154822.html

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

相关文章

【数据库】常用数据库简介

目录 &#x1f354; 常用的关系型数据库 &#x1f354; Mysql简介 &#x1f354; SQL 简介 SQL语句的分类 SQL 写法 SQL 常用的数据类型 &#x1f354; DDL语句 对数据库的操作 对数据表的操作 &#x1f354; DML语句 插入数据 insert into 修改数据 update 删除数…

<<编码>> 第 16 章 存储器组织(3)--3-8 译码器 示例电路

3-8 译码器 info::操作说明 “写入” 开关先断开(Q 为低电平, 表示不写入) S2-S1-S0 设置一个二进制数, 选中 Q0~Q7 其中一个作为 Q 的输出 “数据输入” 端置入要保存的数(0或1) 闭合 “写入” 开关, 对应的一位锁存器中的 W 为高电平, 表示可以写入, “数据输入” 的值最终…

Java安全(加密+HTTPS+WEB安全)

Java加密 单向加密 接收一段明文&#xff0c;然后以一种不可逆的方式将它转换成一段密文 ①、MD5&#xff0c;将无论多长的数据最后编码128位数据&#xff0c;常用文件校验、密码加密、散列数据 byte[] data ...;//明文数据 MessageDigest md5 MessageDigest.getInstance…

大数据新视界 --大数据大厂之Kubernetes与大数据:容器化部署的最佳实践

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【软件资料集】系统培训方案(Word项目参考2024)

1. 培训概述 2. 培训目的 3. 培训对象及要求 3.1. 培训对象 3.2. 培训人员基本要求 4. 培训方式 5. 培训内容 6. 培训讲师 7. 培训教材 8. 培训质量保证 8.1. 用户培训确认报告 8.2. 培训疑问解答 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&…

opencv实战项目二十四:棋盘格相机内参标定

文章目录 前言一、简介&#xff1a;二、使用步骤2.1制作标定板2.2 拍摄不同角度的标定板2.3计算棋盘格角点并优化2.4计算相机参数 三、整体代码实现&#xff1a; 前言 在数字图像处理和计算机视觉领域&#xff0c;相机标定是一个至关重要的步骤。它为相机提供了一个准确的数学…

Tomcat 乱码问题彻底解决

1. 终端乱码问题 找到 tomcat 安装目录下的 conf ---> logging.properties .修改ConsoleHandler.endcoding GBK &#xff08;如果在idea中设置了UTF-8字符集&#xff0c;这里就不需要修改&#xff09; 2. CMD命令窗口设置编码 参考&#xff1a;WIN10的cmd查看编码方式&am…

Nature|PathChat:病理学多模态生成性AI助手的创新与应用|顶刊精析·24-09-21

小罗碎碎念 今日顶刊&#xff1a;Nature 这篇文章今年6月就发表了&#xff0c;当时我分析的时候&#xff0c;还是预印本&#xff0c;没有排版。今天第一篇推文介绍的是Faisal Mahmood &#xff0c;所以又把这篇文章拉出来详细分析一下。 作者角色作者姓名单位名称单位英文名称第…

PMP--二模--解题--61-70

文章目录 4.整合管理61、 [单选] 为解决具有挑战性的客户请求&#xff0c;启动了一个项目。该项目必须在短时间内交付。项目经理应该怎么做来尽可能提高项目的成功率&#xff1f; 14.敏捷--MVP--最小可行产品--使用最小可行产品获得客户尽早地反馈。完整性和交付是主观的。团队…

构建高可用和高防御力的云服务架构第二部分:SLB负载均衡(2/5)

在现代云服务中&#xff0c;负载均衡&#xff08;Load Balancing&#xff09;是一种关键技术&#xff0c;用于优化资源利用、最小化响应时间、提高系统的可伸缩性和可靠性。负载均衡器位于客户端和服务器之间&#xff0c;根据预设的策略将请求分发到多个服务器上&#xff0c;以…

华为HarmonyOS地图服务 4 - 通过“地图相机“控制地图的可见区域

场景介绍 华为地图的移动是通过模拟相机移动的方式实现的,您可以通过改变相机位置,来控制地图的可见区域,效果如图所示。 本章节将向您介绍相机的各个属性与含义,并移动相机。 相机移动前 接口…

基于lnmp搭建wordpress

一、案例目标 &#xff08;1&#xff09;了解LNMP环境的组成。 &#xff08;2&#xff09;了解LNMP环境的部署与安装。 &#xff08;2&#xff09;了解WordPress应用的部署与使用。 二、节点规划 IP 主机名 节点 192.168.200.20 lnmp lnmp服务节点 三、案例实施 LN…

基于微信小程序的购物系统+php(lw+演示+源码+运行)

基于微信小程序的购物系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的购物系统的开发全过程。通过分析基于微信小程序的购物系统管理的不足&#xff0c;创建了一个计算机管理基于微信小…

1.Spring-容器-注册

一、Bean和获取Bean &#xff08;1&#xff09;创建IoC容器&#xff1a; SpringApplication.run(类名.class, args); ConfigurableApplicationContext ioc SpringApplication.run(Spring01IocApplication.class, args); &#xff08;2&#xff09;将对象注册到IoC容器中&am…

[Vue] 从零开始使用 Vite 创建 Vue 项目

&#x1f4da; 一、安装 Node.js Node.js 是一个运行 JavaScript 代码的 JavaScript 运行时&#xff0c;它允许我们在服务器端运行 JavaScript 代码。以下是安装 Node.js 的步骤&#xff1a; &#x1f310; 访问 Node.js 国内网站&#xff1a;https://nodejs.cn/ &#x1f4…

【如何在 Windows 10 主机上通过 VMware 安装 Windows 11 虚拟机,并共享主机网络】

环境说明 主机操作系统&#xff1a;Windows 10虚拟机操作系统&#xff1a;Windows 11虚拟机软件&#xff1a;VMware 步骤一&#xff1a;确保主机&#xff08;Windows 10&#xff09;网络连接正常 启动网络加速软件&#xff1a;在主机上启动软件&#xff0c;确保主机可以正常访…

基于LSTM的温度时序预测

1.背景 本文接【时序预测SARIMAX模型】 一文&#xff0c;采用LSTM模型进行平均温度数据预测。具体的背景和数据分析就不做重复说明&#xff0c;感兴趣可以去看上文即可。 2.LSTM模型 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种特殊…

AI驱动TDSQL-C Serverless 数据库技术实战营-ai学生选课系统数据分析

以前用过腾讯的TDSQL-MYSQL&#xff0c;TBASE&#xff0c;最近了解到TDSQL-C serverless&#xff0c;本次试验结合的AI大模型驱动来学习实战TDSQL-C serverless&#xff0c;体验服务化的数据库&#xff0c;和一句简单描述进行学生选课系统数据分析&#xff1b; 我使用的分析数据…

C++初阶-list用法总结

目录 1.迭代器的分类 2.算法举例 3.push_back/emplace_back 4.insert/erase函数介绍 5.splice函数介绍 5.1用法一&#xff1a;把一个链表里面的数据给另外一个链表 5.2 用法二&#xff1a;调整链表当前的节点数据 6.unique去重函数介绍 1.迭代器的分类 我们的这个迭代器…

【alluxio编译报错】Some files do not have the expected license header

Some files do not have the expected license header 快捷导航 在开始解决问题之前&#xff0c;大家可以通过下面的导航快速找到相关资源啦&#xff01;&#x1f4a1;&#x1f447; 快捷导航链接地址备注相关文档-ambaribigtop自定义组件集成https://blog.csdn.net/TTBIGDA…