Emscripten calling JS from C and returning by reference (pointer)
JS code can manipuate memory directly using setValue, here’s a quick example of returning by reference. The C code is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <emscripten.h> #include <string.h> int main() { char buffer[10]; strcpy (buffer, "nothing" ); int ret = EM_ASM_INT({ return js_receive($0,$1,$2,$3); }, 1,buffer,3,4); printf ( "returned: %d\n" ,ret); printf ( "buffer : %s\n" ,buffer); char call[100]; strcpy (call, "alert('" ); strcat (call,buffer); strcat (call, "')" ); emscripten_run_script(call); } |
And can be called using the following JS which modifies the contents of buffer:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <! DOCTYPE html> < html > < body > < script > function js_receive(a,b,c,d) { var bstr = Pointer_stringify(b); document.write(a + " " + bstr + " " + c + " " + d); setValue(b , 84, 'i8'); setValue(b+1, 87, 'i8'); setValue(b+2, 79, 'i8'); setValue(b+3, 0, 'i8'); return 42; } </ script > < script src = "calljs.js" ></ script > </ body > </ html > |