--
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 emscripten-disc...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsub...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to a topic in the Google Groups "emscripten-discuss" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/emscripten-discuss/l8GkOxZ79Ks/unsubscribe.
To unsubscribe from this group and all its topics, send an email to emscripten-discuss+unsub...@googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsub...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to a topic in the Google Groups "emscripten-discuss" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/emscripten-discuss/l8GkOxZ79Ks/unsubscribe.
To unsubscribe from this group and all its topics, send an email to emscripten-discuss+unsub...@googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-disc...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to a topic in the Google Groups "emscripten-discuss" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/emscripten-discuss/l8GkOxZ79Ks/unsubscribe.
To unsubscribe from this group and all its topics, send an email to emscripten-disc...@googlegroups.com.
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 emscripten-disc...@googlegroups.com.
-- brionOk yeah, that actually make sense. :)Two warnings about using memory views here:
1) As with sending a raw pointer, lifetime management is left up to you. Make sure the underlying object doesn't change or get deallocated before you've used the array contents, or your data may be corrupted.2) Beware of the difference between *typed arrays* and *array buffers* -- a typed array is always a view into an ArrayBuffer object, and when returning data as a memory_view that means you've got a Uint8Array (or other typed array subtype) that is associated with an ArrayBuffer that is the entire, live emscripten heap.So if the API you're passing data to accepts a Uint8Array directly, memory_view is perfect. This is good for, say, uploading WebGL textures. However if your target API actually takes an ArrayBuffer as a single data chunk, then you may need to manually slice out a copy of that portion of the buffer before you can pass it in...Documentation on MDN seems to indicate that XHR.send() should accept a typed array view directly <https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#send%28%29> but the compatibility table is a bit spotty. Double-check that it works in your target browsers. :)
If it does turns out that you need to copy into a separate ArrayBuffer, you can do that on the JS side something like this:var arr = myobj.myfunc();var buf = arr.buffer.slice(arr.byteOffset, arr.byteOffset + arr.byteLength);xhr.send(buf);Should be able to do the equivalent via emscripten::val directly in your binding function as well, though it's probably a bit verbose...
On Sat, Aug 22, 2015 at 3:16 PM, Matthew Tamayo <mat...@kryptnostic.com> wrote:
Thanks, Brion!To add a little more context we have POD types that are contiguous blocks of memory representing multivariate polynomial functions. On the server side we are martially the raw byte buffers through Java into JNI back into native C++ data type.We're thinking the general flow should be:
- Grab binary buffer view of POD data type through a memory view or some kind of object binding.
- Post it as an arraybuffer type using XMLHttpRequest2 to a Java web service
- Rehydrate on the server by taking byte[] -> jbyteArray (JNI) -> jByte * -> reinterpret_cast -> POD *
For security reasons we have validations on the size of the byte arrays server side. It's a self-describing data structure and is generated by filling with random data in the first place so as long size is correct we are safe.These objects can get pretty big (100K -> 7 MB) so having zero cost serialization of the binary form would be ideal.Given this additional context is memory_view the correct approach?-mtr
When using embind, the simplest way to accept an incoming Uint8Array is to declare a binding function that takes a std::string -- the standard type conversions in the bindings will take care of importing the buffer into the emscripten heap space and you'll get a std::string instance that you can get a pointer out of, then do whatever casts are needed to get your C++ object.I think this will allocate the std::string on the stack... not sure offhand if the actual buffer is inline or separately heap-allocated; should only make a difference if you need to keep the rehydrated object around after your function exits.
If you do need to retain the object in the emscripten heap after your function exits and want to minimize data copies, you may wish to control the binding more tightly.
I've tended to do this more with manual JS bindings wrapping C functions:* allocate a heap buffer by calling Module._malloc() or other appropriate allocator* copy the data in; you can do this manually by calling Module.HEAPU8.set() or through a nice wrapper Module.writeArrayToMemory(): https://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html#writeArrayToMemory* pass the pointer in to the C++ function and let C++ manage the pointer lifetime & deallocationShould be able to do roughly the same purely within embind by using emscripten::val calls.-- brion
On Mon, Aug 24, 2015 at 11:11 AM, Matthew Tamayo <mat...@kryptnostic.com> wrote:
Sorry Brion, one more question!What's the easiest way to go in the reverse direction? That is if we receive a UInt8Array from the server, what's the easiest way to pass that into a C++ call? The conversion back is ideally just a reinterpret_cast of an unsigned char * to the correct C++ type.-mtr
Just don't try to get a C string out of it. :) Use the data() method not c_str() to get a pointer.
-- brion