从C+&#x2B构建WebAssembly分类函数和Java源代码

发布于 2025-01-30 04:24:09 字数 2802 浏览 2 评论 0原文

我有一个问题是我要在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字节代码操作:42 at add.java:11

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

我不明白为什么,因为在这个人的演讲中= 93Z9SALQVVW“ rel =” nofollow noreferrer”> 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编译然后在网站上运行的语言?

I have a problem that I was going to work on arrays in WebAssembly and I wanted to use Java and C ++, and trying to do this, I ran into the following problems and I would like to ask for help:

Java: I'm using JWebAssembly

And we have a class that works on tables

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;
    }
}

we convert it to 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);
    }
}

and such an error comes out
Exception in thread "main" de.inetsoftware.jwebassembly.WasmException: Unimplemented Java byte code operation: 42 at Add.java:11

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

And I don't understand why because in this guy's presentation https://www.youtube.com/watch?v=93z9SaLQVVw (40 min+) you can see that it works and compiles

Now C++

I use emscripten, I wanted to do a bubble sort but for the sake of simplicity an example showing the problem

 #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;
}

By running it with this command test.cpp -s WASM=1 -o test.html

after compiling it, files appear to me from which I extract the appropriate data and in javascript I set and import everything

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();

and later in the code I use

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

results

and when I throw in some array of integers it only throws me the number 0 and I have no idea how to get out of it. Or maybe someone knows another language in which it is possible to compile for wasm and then run it on the website?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吹泡泡o 2025-02-06 04:24:09

de.inetsoftware.jwebassembly.wasmexception:未完成的Java字节代码操作:42

您似乎正在使用编译器的过时版本。自2018年以来,已实施了42行动(十六进制值2A)。

de.inetsoftware.jwebassembly.WasmException: Unimplemented Java byte code operation: 42

It appears that you are using an outdated version of the compiler. The operation 42 (hexadecimal value 2a) has been implemented since 2018.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文