Как передать массив в функцию C++ в GraalWasm с помощью API-интерфейса Polyglot? ⇐ C++
Как передать массив в функцию C++ в GraalWasm с помощью API-интерфейса Polyglot?
Я написал простой тестовый файл C++. Файл C++ содержит простую функцию, которая устанавливает значение указателя в 42.
extern "C" { void foo(uint8_t* байты) { байты[0] = 42; } } Затем я использовал Emscripten для компиляции файла C++ в Wasm.
emcc foo.cpp -o foo.wasm -s EXPORT_ALL=1 Я попробовал следующий код для вызова функции, но кажется, что параметр uint8_t* преобразуется в Integer и передает byte[] > к этому не допускаются. Я предполагаю, что это указатель на внутреннюю память WASM, но я не знаю, как выделить буфер, скопировать в него массив Java и скопировать содержимое обратно после вызова функции.
static Final Context CONTEXT = Context.newBuilder("wasm") .allowAllAccess(true).option("wasm.Builtins", "wasi_snapshot_preview1,env:emscripten").build(); var bin = IOUtils.resourceToByteArray("/foo.wasm"); CONTEXT.eval(Source.newBuilder("wasm", ByteSequence.create(bin), "foo").build()); var foo = CONTEXT.getBindings("wasm").getMember("main").getMember("foo"); байт [] обр = {0}; System.out.println(arr[0]); // 0 foo.execute(...); // TODO, как этого добиться? System.out.println(arr[0]); // 42 Я хочу, чтобы моя программа была кроссплатформенной, поэтому я не хочу использовать LLVM в GraalVM (говорят, что бит-код LLVM зависит от платформы). Есть ли у кого-нибудь идеи о том, как этого добиться? Можно скопировать массив Java в память WASM, но лучше передать массив напрямую.
Я написал простой тестовый файл C++. Файл C++ содержит простую функцию, которая устанавливает значение указателя в 42.
extern "C" { void foo(uint8_t* байты) { байты[0] = 42; } } Затем я использовал Emscripten для компиляции файла C++ в Wasm.
emcc foo.cpp -o foo.wasm -s EXPORT_ALL=1 Я попробовал следующий код для вызова функции, но кажется, что параметр uint8_t* преобразуется в Integer и передает byte[] > к этому не допускаются. Я предполагаю, что это указатель на внутреннюю память WASM, но я не знаю, как выделить буфер, скопировать в него массив Java и скопировать содержимое обратно после вызова функции.
static Final Context CONTEXT = Context.newBuilder("wasm") .allowAllAccess(true).option("wasm.Builtins", "wasi_snapshot_preview1,env:emscripten").build(); var bin = IOUtils.resourceToByteArray("/foo.wasm"); CONTEXT.eval(Source.newBuilder("wasm", ByteSequence.create(bin), "foo").build()); var foo = CONTEXT.getBindings("wasm").getMember("main").getMember("foo"); байт [] обр = {0}; System.out.println(arr[0]); // 0 foo.execute(...); // TODO, как этого добиться? System.out.println(arr[0]); // 42 Я хочу, чтобы моя программа была кроссплатформенной, поэтому я не хочу использовать LLVM в GraalVM (говорят, что бит-код LLVM зависит от платформы). Есть ли у кого-нибудь идеи о том, как этого добиться? Можно скопировать массив Java в память WASM, но лучше передать массив напрямую.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Graalpy graalvm java.lang.noclassdeffounderror: org/graalvm/polyglot/context ошибка
Anonymous » » в форуме JAVA - 0 Ответы
- 0 Просмотры
-
Последнее сообщение Anonymous
-