首页 > 编程语言 >java webassembly 集成试用

java webassembly 集成试用

时间:2023-11-01 09:33:14浏览次数:43  
标签:webassembly java wasmer maven wasm 试用 org jni

wasmerio 这个组织实现了不少webassembly 周边的工具,以下是一个简单的java 集成试用

安装命令

因为java 包默认没有发布到中央仓库,需要自己本地安装

  • local maven
mvn install:install-file -Dfile=./wasmer-jni-amd64-darwin-0.3.0.jar -DgroupId=org.wasmer -DartifactId=wasmer-jni-amd64-darwin -Dversion=0.3.0 -Dpackaging=jar -DgeneratePom=true -DlocalRepositoryPath=..../local-maven/repo

wasm 生成

就是一个基于rust 的简单项目,试用了wasm-bingen

  • lib.rs
    注意因为不同版本wasm 对于其他扩展类型支持的问题,此方法使用了标准类型
 
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn greet(age:i32) ->i32 {
   age
}
  • 构建
    使用了wasm-pack
 
wasm-pack build --target nodejs
  • 效果

java 项目集成

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.dalong</groupId>
    <artifactId>wasm-app</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.wasmer</groupId>
            <artifactId>wasmer-jni-amd64-darwin</artifactId>
            <version>0.3.0</version>
        </dependency>
    </dependencies>
 
    <repositories>
        <repository>
            <id>local-maven-repo</id>
            <url>file:///xxxx/local-maven/repo</url> // 使用本地模式
        </repository>
    </repositories>
 
</project>
  • 代码加载wasm
package com.dalong;
 
import org.wasmer.Instance;
 
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
 
public class Main {
    public static void main(String[] args) throws IOException {
        Path wasmPath = Paths.get(new Main().getClass().getClassLoader().getResource("app_bg.wasm").getPath());
 
        // Reads the WebAssembly module as bytes.
        byte[] wasmBytes = Files.readAllBytes(wasmPath);
 
        // Instantiates the WebAssembly module.
        Instance instance = new Instance(wasmBytes);
 
        // Calls an exported function, and returns an object array.
        Object[] results = instance.exports.getFunction("greet").apply(100);
 
        System.out.println((int) results[0]);
 
        // Drops an instance object pointer which is stored in Rust.
        instance.close();
    }
}
  • 运行

因为我使用了mac系统,但是似乎在启动的是否native jni 对于os 的架构识别有问题,需要自己配置下

 

  • 效果

 

说明

以上是一个简单的试用,实际上目前wasmer-java 活跃度一般,简单场景够用,webassembly 做为一个方便可跨平台的模式还是很不错的

参考资料

https://github.com/wasmerio/wasmer-java
https://github.com/rustwasm/wasm-pack
https://medium.com/wasmer/announcing-the-first-java-library-to-run-webassembly-wasmer-jni-89e319d2ac7c

标签:webassembly,java,wasmer,maven,wasm,试用,org,jni
From: https://www.cnblogs.com/rongfengliang/p/17802326.html

相关文章

  • 加固数据安全:Java助力保护Excel文件,让数据无懈可击
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言Excel文件保护是常用的一种功能,文件保护主要有三种:添加密码,如果没有密码不允许打开文件。添加密码,如果没有密码,不能修改文件,但可......
  • java高并发系列
    同步(Synchronous)和异步(Asynchronous)同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”......
  • mac 切换java jdk版本 java8 java11
    1.  终端执行命令查看本地各版本jdk:mac通常默认安装了jdk1.8安装目录是/Library/Java/JavaVirtualMachines/cd/Library/Java/JavaVirtualMachines/ls2.上述命令列出的各版本目录名后,在全局配置文件.bash_profile中新增上面命令列出的各版本jdk,并指定当前环境变量默认......
  • linuxjava安装
    linux安装java1.8一、确认是否安装JDK,通过rpm-qa|grepjava命令查看然后https://www.oracle.com/java/technologies/downloads/#java8下载java二.进入user/local这个目录是管理员安装引用程序的目录三.进行文件上传然后把文件拖进新开的窗口里就ok了三.通过tar-......
  • java如何不创建对象就可以使用静态方法(类方法)System类等
    对象初始化一定有类加载,但是类加载不一定会对象初始化,静态方法不需要创建对象就能调用,这是因为静态方法属于类而不是对象。在Java中,静态方法是属于类的方法,而不是属于特定的对象实例的方法。当类加载到内存中时,静态方法也会加载到内存中。因此,可以直接通过类名来调用静态方法,而不......
  • 代码 测试用例 测试用例 测试结果 26. 删除有序数组中的重复项
    给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通......
  • java 基本数据类型和引用数据类型
    ......
  • Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.util
    我的项目是springboot架构,项目启动报错如下Exceptioninthread"main"java.lang.NoSuchMethodError:org.springframework.util.Assert.isInstanceOf(Ljava/lang/Class;Ljava/lang/Object;Ljava/util/function/Supplier;)V atorg.springframework.boot.logging.logback.Logb......
  • Java基础面试题收集(1)
    @目录1.一个“.Java"源文件中是否可以包括多个类(不是内部类)?有什么限制?2.Java有没有goto?3.&于&&的区别4.在Java中如何跳出当前的多重嵌套循环?5.Switch语句能否用在byte,long,String上?6.shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?7.char型变量中能不能存储一个......
  • java日常记录1
    java学到框架了,发现javaSE的东西忘记的差不多了,故此挂在这里流个记录,方便将来查看,顺便巩固一下学过的知识点,文章可能有点长,我打算利用文章和代码结合的方式记录一下。顺便本文档的参考文献主要来自秦老师,当然还有自己从书本上摘抄的一下东西。java基础java自1991年,由sun公司的工......