graalvm把java编译为c/c++能够使用的动态库(dll/so)

news2024/12/25 0:17:55

graalvm把java编译为c/c++能够使用的动态库(dll/so)

1.安装graalvm

oracle官方企业版

github的openjdk版本

1.1 下载对应系统版本,配置环境变量

本人环境

1.
win10
openjdk 17.0.5 2022-10-18
OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08, mixed mode, sharing)

2.deepin v23  oracle的需要邮箱验证,随便搞一下就行
java 17.0.7 2023-04-18 LTS
Java(TM) SE Runtime Environment GraalVM EE 22.3.2 (build 17.0.7+8-LTS-jvmci-22.3-b15)
Java HotSpot(TM) 64-Bit Server VM GraalVM EE 22.3.2 (build 17.0.7+8-LTS-jvmci-22.3-b15, mixed mode, sharing)

1.2 安装c/c++开发工具

win10需要安装 Visual Studio

1.2下载对应工具

1.cmd命令使用  其中gu是graalvm提供的工具
gu available  查看可用的工具
安装native-image 、llvm、llvm-toolchain  

espresso
js                       
llvm			
llvm-toolchain  使用动态库的话要安装这个和llvm
native-image   直接把java便以为可执行文件必须安装
nodejs
visualvm 
wasm 

2.编写代码

2.1 HelloWorld.java

编写限制

1.必须有一个入口函数,默认可以是main方法,可以在c或者c++调用

2.方法必须是静态(公开私有好像无所谓,没研究)

3.导出的方法要使用@CEntryPoint注解标记

4.方法第一个参数必须是IsolateThread,这个是c/c++的线程上下文

5.方法返回值可以是指针(graalvm里面有指针类型)和基本类型,不能是包装类型

import org.graalvm.nativeimage.IsolateThread;
import org.graalvm.nativeimage.c.function.CEntryPoint;
import org.graalvm.nativeimage.c.type.CCharPointer;
import org.graalvm.nativeimage.c.type.CTypeConversion;

public	class HelloWorld{
	public static void main(String[] args){
		System.out.println("Hello World");
	}
	
	@CEntryPoint(name = "add")
	public static int add(IsolateThread thread, int a, int b) {
			//这里测试修改动态库把+换成*
    		return a * b;
	}
}

2.2 编写c代码

2.2编译生成头文件和动态库

1.javac HelloWorld.java   这里的javac必须是graalvm提供的
2.native-image HelloWorld 这里直接生成pe或者elf文件(相当于静态连接) win10最好是在x64里面进入命令行
3.native-image -H:Name=libhelloworld --shared
这里会生成几个头文件

libhelloworld_dynamic.h  graal_isolate_dynamic.h  HelloWorld.java                 graal_isolate.h          libhelloworld.build_artifacts.txt  libhelloworld.so  libhelloworld.dll


2.3 编写c代码

注意libhelloworld.h文件里面有引用graal_isolate.h 可以把尖括号换成双引号

#include <stdio.h>
#include <stdlib.h>

#include "libhelloworld.h"

int main(int argc, char **argv) {
    if (argc < 3) {
        fprintf(stderr, "请输入两个数字\n", argv[0]);
        exit(1);
    }

    graal_isolate_t *isolate = NULL;
    graal_isolatethread_t *thread = NULL;

    if (graal_create_isolate(NULL, &isolate, &thread) != 0) {
        fprintf(stderr, "initialization error\n");
        return 1;
    }
    int num1 = 0;
    int num2 = 0;
    sscanf_s(argv[1], "%d", &num1);
    sscanf_s(argv[2], "%d", &num2);
    int result = add(thread, num1, num2);
    printf("%d+%d=%d\n", num1, num2, result);

    graal_tear_down_isolate(thread);
    return 0;
}

2.4 编译代码


4.使用clang编译并且动态连接
win10

%JAVA_HOME%/languages/llvm/native/bin/gcc -I ./ -L ./ -l libhelloworld  -o main main.c

deepin
$JAVA_HOME/languages/llvm/native/bin/gcc -I ./ -L ./ -l helloworld -Wl,-rpath ./ -o main main.c

3.执行代码

这个功能的作用

1.一些现成的java工具类或者算法可以直接搬到c/c++
2.这个生成的动态库在java侧也能使用,增加反编译复杂程度
3.java和c/c++的桥梁进一步扩宽

打完收工

参考文章 oracle官网连接

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

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

相关文章

chatgpt赋能python:Python中的None值如何去掉?

Python中的None值如何去掉&#xff1f; Python是一种具有高度灵活性和可读性的编程语言&#xff0c;它有许多强大的功能&#xff0c;令许多开发人员喜欢使用它。然而&#xff0c;可能会遇到延迟或者None值的情况&#xff0c;这时需要我们找到正确的方法去除它们。 None值是什…

C#,码海拾贝(27)——求解“对称方程组”的“分解法”之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

happens-before规则

happens-before背景由来 happens-before的概念最初由Leslie Lamport在其一篇影响深远的论文&#xff08;《Time&#xff0c;Clocks and the Ordering of Events in a Distributed System》&#xff09;中提出。Leslie Lamport使用 happens-before 来定义分布式系统中事件之间…

【利用AI让知识体系化】7种结构型模式

文章目录 结构型模式简介适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式 结构型模式 简介 在设计模式中&#xff0c;结构型模式用于描述如何将对象和类组装成较大的结构&#xff0c;并灵活地处理对象之间的关系。 结构型模式包括以下几种&#xff1a; 适配器…

驱动开发——嵌入式(驱动)软开基础(十)

1. 64位的计算机有哪些优点&#xff1f; &#xff08;1&#xff09;可以进行更大范围的整数计算。 &#xff08;2&#xff09;可以支持更大的内存&#xff0c;虚拟内存空间大小一般为2^48&#xff08;256TB&#xff09;。64位的Linux一般使用48位表示虚拟内存空间地址&#x…

esp8266 OTA远程无线升级

第一步、编译生成.bin升级固件 本教程需要用到 arduino IDE的esp8266开发环境,关于arduino IDE 的ESP8266环境配置可参考:环境配置: 点击跳转 如果已安装好esp8266 开发环境,继续: 使用arduino IDE软件,打开随便一个需要升级的程序,点击「项目」-「导出已编译的二进制…

【Bug 全解决】 Java、Spring boot 后端项目 Bug 总结

Bug 收集与总结 本文记录的是 SpringBoot 后端项目使用和运行代码时所遇到的各种问题&#xff0c;全部都已解决&#xff0c;欢迎在评论区补充你遇到的 Bug 哦&#xff01;仅以本文记录学习社区项目时&#xff0c;所遇到的奇奇怪怪的 bug&#xff0c;以及一些很愚蠢的错误&…

Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

目录 223. 矩形面积 Rectangle Area &#x1f31f;&#x1f31f; 226. 翻转二叉树 Invert Binary Tree &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

RPC原理与实现

rpc叫做远程过程调用&#xff0c;是指一台机器上的服务通过通信协议调用网络中另一台机器上的程序&#xff0c;并拿到结果。 1、基本流程 基本流程为&#xff1a; 客户端程序通过Client Stub调度rpc函数Client Stub将调用方法、参数按照通信协议序列化成网络二进制数据&#…

koa2中HTTP错误处理

HTTP错误 访问 Web 服务器或应用程序时&#xff0c;服务器收到的每个 HTTP 请求都会以 HTTP 状态代码进行响应。 HTTP 状态代码是三位数代码&#xff0c;分为五个不同的类别。 状态代码的类别可以通过它的第一个数字快速识别&#xff1a; 1xx&#xff1a;信息2xx&#xff1a…

“大娘,你听说过ChatGPT吗?”,“你说的那个什么鸡皮蹄,我这饼里加不了!”

最近看到一个有意思的段子&#xff0c;大概意思是&#xff1a; 年轻人去买煎饼&#xff0c;问摊煎饼的大娘知不知道什么是ChatGPT。 大娘摇了摇头&#xff1a;“你说的那个什么鸡皮蹄&#xff0c;我这饼里加不了”。 年轻人尝试跟大娘解释ChatGPT是什么东西&#xff0c;大娘…

快速上手kettle(二)小试牛刀

快速上手kettle二 小试牛刀 一 、前言二 、两个小目标三、 kettle核心概念介绍3.1 转换3.1.1 步骤(Step)3.1.2 跳&#xff08;Hop&#xff09;3.1.3 元素据3.1.4 数据类型3.1.5 并发执行 3.2 作业 四、实践操作4.1 案例1 将csv文件转换成excel文件4.1.1 在kettle中新建一个转换…

在Node.js中接受来自命令行的输入

目录 1、简介 2、readlineSync 3、列表选择一个项目&#xff1a; 4、类似滑块范围的UI: 1、简介 如何制作一个Node.js CLI程序使用内置的readline Node.js模块进行交互 如何制作一个节点js CLI程序交互&#xff1f; Node.js 从版本7起开始提供了readline模块来执行以下操…

styleFlow数学推导

如果 w 和 z 的变换是线性的&#xff0c;即 w az b&#xff0c;那么 dw a dz&#xff0c; 所以 p(w) dw p(z) dz 等价于 p(w) a p(z) 即 w 的概率密度函数是 z 的概率密度函数乘以一个常数因子。 如果 w 和 z 是通过一个可逆的函数 ϕ 相互转换的&#xff0c;即 w ϕ(…

5.29今日黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;上周五(5月26日)美市尾盘&#xff0c;现货黄金收报1946.01美元/盎司&#xff0c;上升4.76美元或0.25%&#xff0c;日内最高触及1957.31美元/盎司&#xff0c;最低触…

1.3 eBPF的工作原理初探 --- 更新中

写在前面 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。 我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。 如上是…

Java学习路线(16)——异常

一、异常 1、概念&#xff1a; 程序在“编译”或“执行”时可能出现的问题。&#xff08;语法错误不算异常&#xff09; 2、常见的异常 数组索引越界空指针日期格式化… 3、作用&#xff1a; 触发异常后&#xff0c;如果没有提前处理&#xff0c;JVM将终止&#xff0c;提高…

chatgpt赋能python:Python中None的使用详解

Python中None的使用详解 在Python语言中&#xff0c;None是一个非常常见的值&#xff0c;它在代码中用来表示空值或未定义的值。本文将介绍Python中None的使用方式&#xff0c;包括创建和比较None对象&#xff0c;以及在函数和类中使用None的方法。 创建和比较None对象 在Py…

chatgpt赋能python:Python中Key的作用及使用方法

Python中Key的作用及使用方法 在Python中&#xff0c;key是一个十分重要的概念。它在数据结构中经常被使用&#xff0c;例如list、dict、set、tuple等等。本文将重点介绍Python中key的作用和使用方法&#xff0c;帮助读者更好地理解和应用它。 什么是Key 首先&#xff0c;我…

返回数组中非零元素的索引np.flatnonzero()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回数组中非零元素的索引 np.flatnonzero() 选择题 以下程序的运行结果是? import numpy as np anp.array([0,1,2,3]) print("【显示】a:");print(a) print("【执行】print(n…