Depending on your needs, you might consider creating an aliased Uint8Array view into the heap-allocated array and using that directly on the JavaScript side. You'll need a way to control the lifetime of the pointer on the C side so this can be more complex but saves you the copies. This can make a big performance difference when pushing WebGL textures for instance.
-- brion On Mar 6, 2015 3:14 AM, "Stefano Sabatini" <[email protected]> wrote: > Hi, > > I want to call a C function dealing with arrays from Javascript. > > The function is created with emscripten. I also want to create JS > functions handling native JavaScript arrays, for example a > Uint8Array. > > From my understanding I have to create a JS wrapper allocating an > array in the heap, copy the data from the JS array, process the data > through the emscripten generated function, and finally copy the > processed data back to a JS array. > > Consider this example: > > C function: > void multiply_array(uint8_t factor, uint8_t *buf, size_t buf_size) > { > for (int i = 0; i < buf_size; i++) { > buf[i] = factor * buf[i]; > } > } > > JS wrapper: > multiply_by_factor = function(u8array, factor) { > // need to get the array pointer, u8array is Uint8Array > > // Get data byte size, allocate memory on Emscripten heap, and get > pointer > var dataPtr = Module._malloc(u8array.length); > > // allocate new Uint8Array in the Emscripten heap (directly accessed > from Module.HEAPU8) > var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, > u8array.length); > > // copy data to the heap > dataHeap.set(u8array); > > // Call function and process data inplace > _multiply_array(factor, dataPtr, u8array.length); > var result = new Uint8Array(u8array.length); > result.set(dataHeap); > > // Free memory from emscripten heap > Module._free(dataHeap.byteOffset); > return result; > } > > This function is working fine, but I wonder if it's possible to avoid > to allocate data on the emscripten heap, in order to avoid the two > memcpy calls. > > TIA > > -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
