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:

#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:

 <!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>

Comments are closed.