我有一个问题,我打算在 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));
当我输入一些整数数组时,它只会给我数字 0,我不知道如何摆脱它。或者也许有人知道另一种可以为 wasm 编译然后在网站上运行它的语言?
de.inetsoftware.jwebassembly.WasmException:未实现的 Java 字节码操作:42
看来您使用的是过时版本的编译器。操作42(十六进制值2a)从2018年开始执行。