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.cdeepin
$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官网连接

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

  1. java调用C或者C++动态库dll

    java调用C或者C++动态库dll,本文章使用的是IntelliJ IDEA Community Edition 2021.2.3版本测试的 1.新建项目 linjie.demo,添加类HelloL ...

  2. windows7下,Java中利用JNI调用c++生成的动态库的使用步骤

    1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-wi ...

  3. java调用c语言_Java调用C语言动态库(JNA方式,持续)

    过程主要分为以下几个步骤: 1.vs2017编写cpp/h代码,编译成dll,编译成功后,用depends查看库的依赖是否有缺失,也可以自己写个demo,调用这个dll中的函数,是否可以调用成功作为验 ...

  4. 【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )

    文章目录 一.报错信息 二.解决方案 ( Android Studio 配置外部 so 动态库两种方法 ) 1.jniLibs 目录存放 2.libs 目录存放 一.报错信息 外部引用 so 动态库 ...

  5. VS2010动态库dll的编译和MFC调用使用教程64位32位

    前言 本文主要介绍64位和32位dll的编译与MFC和控制台程序显式调用dll的教程.2019.09.05添加了复杂函数的导出教程.显示链接只需要.dll文件,但是这种调用方式不能调用dll中的变量或 ...

  6. java调用c so动态库_jni 调用C动态库dll/so

    http://hi.baidu.com/fengying765/blog/item/7081113e5fde53e555e7233f.html 作为主调方的Java源程序TestJNI.java如下. ...

  7. Java调用动态库 缺点_java调用动态库(dll)的一些问题

    javac 1)dos切换到java文件所在目录,使用javac编译出class文件 javah的一些问题: 1)切换到src目录下 2)设置路径命令:set classpath=src目录的完全路径 ...

  8. linux mp4v2编译,Android 编译mp4 v2 2.0.0生成动态库

    6.最后在jni目录下的终端中输入ndk-build,结果如下: root@zhangjie:/home/zhangjie/mp4v2-2.0.0/jni# ndk-build Android NDK ...

  9. 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

    文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...

最新文章

  1. Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix)、使用replace函数批量删除列名中的后缀(suffix)
  2. 使用Xcode和Instruments调试解决iOS内存泄露(转)
  3. javascript基础(第一天)
  4. Linux命令——find详解
  5. RequiredFieldValidator----验证控件不起作用
  6. 免费字典api ,查询汉字完整信息
  7. Vue中render: h = h(App)的含义
  8. openshift_云上的播放框架变得简单:Openshift模块
  9. findbugs使用_FindBugs,一个帮你找bug的IDEA插件
  10. python等待时间1009python等待时间_Python之学习Selenium(四):固定的休眠时间、隐式等待和显示等待...
  11. 深入浅出mysql_深入浅出mysql索引
  12. spring AOP 代理(静态与动态+使用cglib实现)
  13. “网易有钱”sketch使用分享
  14. CF14A Letter(模拟+字符串)(C++题解)(大佬勿喷)
  15. laravel-admin / Dcat admin 上传Excel并导入数据到数据库
  16. uniapp 实现微信小程序全局分享及自定义分享按钮样式
  17. 使用for循环同时便利两个列表
  18. RAID技术规范简介 RAID0 RAID1 RAID2 RAID3 RAID4 RAID5 RAID6 RAID7
  19. siri打电话功能测试用例编写
  20. 【KALI】自制U盘版KALI(即插即用具有可持久化功能)

热门文章

  1. Kong — proxy
  2. mysql 命令导入excel,【mysql命令导入excel表】excel表格怎样导入数据库
  3. 一文看懂数据清洗:缺失值、异常值和重复值的处理
  4. Java的递归map遍历公司组织架构
  5. web第八课:图片标签的路径和属性
  6. 《Android 开发艺术探索》笔记2--IPC机制
  7. GenZ,CXL,NVLINK,OpenCAPI,CCIX乱战
  8. Matlab数学建模笔记
  9. 语音怎么转换成文字?分享两种语音转文字的方法
  10. [附源码]Python计算机毕业设计SSM基于的优质房源房租管理系统(程序+LW)