从 C++ 和 Java 源代码构建 webassembly 排序函数

问题描述 投票:0回答:1

我有一个问题,我打算在 WebAssembly 中处理数组,我想使用 Java 和 C++,并尝试这样做,我遇到了以下问题,我想寻求帮助:

Java:我正在使用 JWebAssembly

我们有一个在桌子上工作的课程

import de.inetsoftware.jwebassembly.api.annotation.Export;

public class Add {
    @Export
    public static int[] add( int a[], int b ) {

        for(int i = 0;i<b-1;i++){
            a[i] += b ;
        }
        return a;
    }
}

我们将其转换为 wasm

import de.inetsoftware.jwebassembly.JWebAssembly;

import java.io.File;
import java.net.URL;

public class Wasm {
    public static void main(String[] args) {
        File wasmFile = new File("testTable.wasm");
        JWebAssembly wasm = new JWebAssembly();

        Class clazz = Add.class;

        URL url = clazz.getResource(
                '/' +
                        clazz.getName().replace('.', '/') +
                        ".class");
        wasm.addFile(url);
        String txt = wasm.compileToText();
        System.out.println(txt);
        wasm.compileToBinary(wasmFile);
    }
}

然后出现这样的错误 线程“main”中的异常 de.inetsoftware.jwebassembly.WasmException:未实现的 Java 字节码操作:Add.java:11 处的 42

https://en.wikipedia.org/wiki/List_of_Java_bytecode_instructions

我不明白为什么,因为在这个人的演示中 https://www.youtube.com/watch?v=93z9SaLQVVw(40 分钟以上)您可以看到它有效并编译

现在 C++

我使用 emscripten,我想做一个冒泡排序,但为了简单起见,一个显示问题的例子

 #include <emscripten.h>
 using namespace std;
 
EMSCRIPTEN_KEEPALIVE
int* mainFunction(int table[], int length)
{
    
    int* outTable = new int[length];

    for(int i = 0;i<length; i++){
        outTable[i] = table[i];
    }

    return table;
}

通过使用此命令运行它 test.cpp -s WASM=1 -o test.html

编译后,文件出现在我面前,我从中提取适当的数据,并在 javascript 中设置并导入所有内容

let wasmExports = null;

let asmLibraryArg = {
    abort: () => {},
    emscripten_resize_heap: () => {},
};

let info = {
    env: asmLibraryArg,
    wasi_snapshot_preview1: asmLibraryArg,
};

async function loadWasm() {
    let response = await fetch("test.wasm");
    let bytes = await response.arrayBuffer();
    let wasmObj = await WebAssembly.instantiate(bytes, info);
    wasmExports = wasmObj.instance.exports;
}

loadWasm();

稍后在我使用的代码中

console.log(wasmExports);
console.log(wasmExports._Z12mainFunctionPii(table, table.length));

results

当我输入一些整数数组时,它只会给我数字 0,我不知道如何摆脱它。或者也许有人知道另一种可以为 wasm 编译然后在网站上运行它的语言?

java c++ webassembly emscripten jwebassembly
1个回答
0
投票

de.inetsoftware.jwebassembly.WasmException:未实现的 Java 字节码操作:42

看来您使用的是过时版本的编译器。操作42(十六进制值2a)从2018年开始执行。

© www.soinside.com 2019 - 2024. All rights reserved.