Как получить массив uint8_t из C в JavaScript? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть тип массива uint8_t в C. Функция с именем getResultArray вернет этот массив. Как я могу получить этот массив в JavaScript?

uint8_t * getResultBuffer () {вернуть resultBuffer}

1 Ответ

1 голос
/ 08 мая 2019

Указатель, возвращаемый функцией C, представляет собой смещение в ArrayBuffer, которое Emscripten использует для представления памяти.Для просмотра как uint8_t, получите доступ к памяти, используя Module.HEAPU8.

. Вот пример, использующий em ++:

fill_array.cpp:

#include "stdint.h"

extern "C" {
    uint8_t* fill_array(int n);
}

uint8_t* fill_array(int n) {
    uint8_t* arr = new uint8_t[n];
    for(uint8_t i=0;i<n;++i)
        arr[i] = i;
    return arr;
}

index.html:

<!doctype html>
<html>
<body>
    <script>
        var Module = {
          onRuntimeInitialized: function() {
            var fill_array = Module.cwrap('fill_array', 'number', [])
            var n = 16;
            var ptr_from_wasm = fill_array(n);
            var js_array = Module.HEAPU8.subarray(ptr_from_wasm, ptr_from_wasm + n);
            alert(js_array);
          },
        };
    </script>
    <script async type="text/javascript" src="index.js"></script>
</body>
</html>

Результаты следующие:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

Чтобы это работало, вам понадобитсядобавить следующие аргументы в em ++ :

-s EXPORTED_FUNCTIONS='["_fill_array"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'

См. полный исходный код в Этот репозиторий

...