首页 > 编程语言 >使用JNA在java中调用rust函数

使用JNA在java中调用rust函数

时间:2024-10-11 16:24:12浏览次数:9  
标签:CLibrary void jna JNA add printf java rust

JNA是sun公司对JNI能力的封装,更多信息请自行问AI。咱们直接上代码。

调用系统本地库

先引入jar包:

   <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
   <dependency>
     <groupId>net.java.dev.jna</groupId>
     <artifactId>jna</artifactId>
     <version>5.15.0</version>
   </dependency>

然后写java

    public static void main(String[] args) {
       jna();
   }

   public interface CLibrary extends Library {
       CLibrary INSTANCE = Native.load((Platform.isWindows() ? "msvcrt" : "c"),
               CLibrary.class);

       void printf(String format, Object... args);
   }

   private static void jna() {
       CLibrary.INSTANCE.printf("Hello, World!\n");
   }

这段代码会寻找系统的共享库,并调用库中的printf函数。

调用rust

如果上面的代码没问题,咱们继续。
新建一个rust源文件,名称随意。比如我的是 src/lib.rs

#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
   a + b
}

执行命令

rustc --crate-type cdylib -o libadd.dylib src/lib.rs

你只需要更换最后一个文件参加即可。

dylib是Mac的后缀,如果是win要用dll,Linux要用so

打包完了后,把这个库文件放到java的classpath(或者直接放到target/classes/下面)。

修改java文件:

    public static void main(String[] args) {
        jna();
    }

    public interface CLibrary extends Library {
        CLibrary INSTANCE = Native.load("add", CLibrary.class);

        void printf(String format, Object... args);
        int add(int a, int b);
    }

    private static void jna() {
        CLibrary.INSTANCE.printf("Hello, World!\n");
        System.out.println(CLibrary.INSTANCE.add(1, 2));
    }

注意一下,库名不需要前缀 "lib" 和后缀。
这里增加了add方法的定义,但是没移除printf,它依然能用。

标签:CLibrary,void,jna,JNA,add,printf,java,rust
From: https://www.cnblogs.com/somefuture/p/18458684

相关文章

  • java+vue计算机毕设工作计划统计分析系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今快节奏的商业环境中,企业的高效运作离不开精细化的管理与规划。随着企业规模的扩大,部门间协作的复杂性、员工工作计划的多样性以及项目进度的动......
  • java+vue计算机毕设工程认证辅助系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全球工程教育的快速发展,工程认证已成为衡量高等教育质量与国际接轨的重要标尺。它不仅要求教育机构具备完善的教学体系,还强调对学生实践能力和创......
  • java+vue计算机毕设食品点评及售卖系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的快速发展和人们生活节奏的加快,线上食品点评及售卖系统已成为现代都市生活不可或缺的一部分。近年来,食品安全问题频发,消费者对食品质量、......
  • LeetCode:871. 最低加油次数(DP Java)
    目录871.最低加油次数题目描述:实现代码与解析:DP原理思路:871.最低加油次数题目描述:        汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。沿途有加油站,用数组 stations 表示。其中 stations[i]=[positioni,fueli] 表示第 ......
  • java毕业设计-基于Springboot的多商家商城系统【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:Springboot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能管理员管理:负责系统后台的整体运维,包......
  • java计算机毕业设计分布式生鲜市场信息系统设计与实现(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和消费观念的转变,生鲜食品市场迎来了前所未有的发展机遇。然而,传统的生鲜销售模式面临着信息不对称、供应链冗长、损耗率高等......
  • 基于java+springboot的社区心理健康服务平台系统小程序
    基于java+springboot的社区心理健康服务平台系统,旨在为社区居民提供全面的心理健康支持。后端运用springboot构建稳定可靠的服务,负责处理用户信息管理、心理咨询师资源整合、心理测评工具管理以及预约咨询安排等核心业务,与数据库有效交互以存储用户心理健康档案、咨询......
  • 基于java+springboot的社区汽车共享平台系统
    基于java+springboot的社区汽车共享平台系统,致力于为社区居民提供便捷的汽车共享服务。后端采用springboot构建,高效处理车辆信息管理、用户认证与授权、预订流程控制及费用结算等业务,与数据库紧密交互确保车辆状态、用户信息及预订记录准确存储与快速检索。前端利用相......
  • Rust 变量和基础类型
    Rust变量和基础数据类型2024-03-13类型,元组,数组,切片,动态数组,生命周期,动态大小,静态大小Rust通过let关键字声明变量,变量默认是不可变(只读)的.letfoo=5;//创建了一个不可变的变量foo,并绑定了5foo=10;//不能对foo重新绑定//使用mut关键字创......
  • 教你如何免费获取股票数据用python、JavaScript (Node.js)、JAVA等多种语言的实例代码
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......