emscriptem - как читать C-массив из JavaScript (Chrome / Firefox)? - PullRequest
0 голосов
/ 28 сентября 2018

Вот мой C-код:

// helloworld.c
#include <stdio.h>
#include <emscripten.h>

int* EMSCRIPTEN_KEEPALIVE getIntArray(){
    static int numbers[] = {1, 2, 4, 8, 16};
    return numbers;
}

Вот некоторые из моих JS:

// helloworld.html
let result = Module.ccall('getIntArray', // name of C function
  'Uint8Array', // return type
  [null], // argument types
  [null]); // arguments

let array = new Uint8Array(result,5);

console.log(result); // prints 1024
console.log(array); // prints Uint8Array(1024) [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, … ]

Все это компилируется и работает нормально.Приведенный выше код прекрасно работает для примитивных значений, но не работает с указателем массива, а типизированный массив JS, который я получаю, - это все нули.Я видел некоторые другие решения в документации, но они, похоже, не работают и для меня.

1 Ответ

0 голосов
/ 28 сентября 2018

Вы getIntArray функция собирается вернуть целое число, которое является местоположением массива в линейной памяти модулей WebAssembly.Чтобы использовать это, вам понадобится ссылка на линейную память модуля.

Один из вариантов - создать линейную память на стороне JavaScript:

const imports = {
    env: {
      memoryBase: 0,
      tableBase: 0,
      memory: new WebAssembly.Memory({
        initial: 512
      }),
      table: new WebAssembly.Table({
        initial: 0,
        element: 'anyfunc'
      })
    }
  };

  const instance = new WebAssembly.Instance(module, imports);

Затем вы можете использоватьвозвращенный результат, который будет целым числом, как смещение в линейной памяти:

 const result = Module.ccall('getIntArray', // name of C function
  'Uint8Array', // return type
  [null], // argument types
  [null]); // arguments

  const data = new Uint8Array(imports.env.memory.buffer, result, 5);
...