使用JNA在java中调用rust函数

news/2024/10/11 16:24:05

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,它依然能用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/70263.html

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

相关文章

Flutter功能性组件(2):弹出框

一、showModalBottomSheet(模态底部弹出框) showModalBottomSheet 用于显示一个模态底部弹出框。 属性解析: Future<T?> showModalBottomSheet<T>({required BuildContext context, // 表示底部弹出框所处的上下文,通常来自当前 widget。required WidgetBuild…

Flutter容器(6):页面骨架(Scaffold)

Material 组件库提供了丰富多样的组件,这里介绍一下最常用的 Scaffold 组件,其余的读者可以自行查看文档或 Flutter Gallery 中 Material 组件部分的示例。注意:Flutter Gallery 是 Flutter 官方提供的 Flutter Demo,源码位于 flutter 源码中的 examples 目录下,笔者强烈建…

Golang上下文context

上篇内容我们主要讲解了net/http标准库的使用,其中包含如何创建POST请求、GET请求以及如何携带参数的请求。 Context介绍 context释义为上下文,在我们使用goroutine时一般使用context来进行元数据的传递,非元数据不建议使用context来进行传递。那么我们主要是用context用来做…

2024 最新 IntelliJ IDEA 2024.1.6 激活(亲测可用)

注意:接下来本文分享免费激活 IDEA 等Jetbrains全家桶工具,一直支持到最新版本2024.1.6。 1.下载安装IDEA (mac、window、linux都支持) 大家直接在官网下载最新版本,登陆官网,下载最新版本2024.1.4。一步一步确定安装,然后打开 这里提示输入激活码,先关闭应用!!!2.…

淘宝程序员没活硬整?在 Excel 和 VSCode 中购物!

你可以在 Excel 表格中挑选商品进行购物,还原度极高,这两个图表更是点睛之笔。哪个天才想出来的,把特么广告都整成了 Excel 图表。大家好,我是程序员鱼皮,最近某宝网站的改进,属实是有点 “新” 了。 你敢相信这是一个购物网站么?你可以在 Excel 表格中挑选商品进行购物…

Golang模板template

背景概述 当我们在进行json字段选取以及渲染时,我们经常会见到{{}},其实这就是我们今天要讲解的模板即是template。例如prometheusAlert中的模板就是使用了改语法。 必备技能字段选取 ❝ {{ . }} 表示json的所有域,例如:{"name":"anruo","age&quo…

如何在springboot中,全局配置produces=text/plain;charset=UTF-8

为什么要使用produces="text/plain;charset=UTF-8"? 当不用这个配置时,接口返回的数据,是有斜杠的 配置后,就正常了 以前我的配置方式,是在每个接口上,都添加上produces="text/plain;charset=UTF-8"。但是这样显示不太好,每个接口都加的话,会比较…

鸿蒙发送消息通知

注意:发送消息通知要开启设置中的消息通知import notify from @ohos.notificationManager import image from @ohos.multimedia.image import { BusinessError } from @kit.BasicServicesKit@Entry @Component struct NotificationPage {// 全局任务ididx: number = 100// 图象…