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>

Comments are closed.