emscripten.hを使ってみた時のメモ

More than 3 years have passed since last update.

emscriptenのAPIにC言語からアクセスするためのヘッダ、

emscripten.hを触ってみたのでメモ。

参考: http://kripken.github.io/emscripten-site/docs/api_reference/emscripten.h.html


URL先からデータを取得する

emscripten_async_wget関数などを使う

http://kripken.github.io/emscripten-site/docs/api_reference/emscripten.h.html#c.emscripten_async_wget

例: example.comにGETで取得したものを出力するプログラム

一度file.txtに保存してから読み込みなおしている。


emcc_wget.c

#include <stdio.h>

#include <stdlib.h>
#include <emscripten.h>

void onLoadCallback(const char *filename) {
FILE *fp;
char s[256];

if((fp = fopen(filename, "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}

while (fgets(s, 256, fp) != NULL) {
printf("%s", s);
}
fclose(fp);
}

void onErrorCallback(const char *err) {
printf("%s", err);
}

int main() {
emscripten_async_wget("http://example.com", "file.txt", onLoadCallback, onErrorCallback);
return 0;
}


コンパイル時のオプション

$ emcc -s ASYNCIFY=1 -s NO_EXIT_RUNTIME=1  emcc_wget.c

ブラウザ上でscriptタグ使って読み込むと使えることを確認した。

ただし、wgetで読み込むURLはsame origin policyの影響を受けるので注意が必要。


Javascriptを埋め込む

inlineでJavascriptを埋め込むための EM_ASMなどの関数がある。

http://kripken.github.io/emscripten-site/docs/api_reference/emscripten.h.html#inline-assembly-javascript

EM_ASM関数は、以下のように利用する。


emcc_em_asm.c

#include <stdio.h>

#include <emscripten.h>

int main() {
EM_ASM({ alert("hello"); });
return 0;
}

C言語の変数をEM_ASM内で使いたい場合、EM_ASM_ARGS関数を用いて、引数として渡す。

この時、EM_ASM_ARGS内では引数として渡した順に$0, $1, $2, ...となる。


emcc_em_asm_args.c

#include <stdio.h>

#include <emscripten.h>

int main() {
int a = 1;
EM_ASM_ARGS({ console.log($0); }, a);
return 0;
}

EM_ASMの使用上の注意点として、ASM内で改行した場合実行時にエラーになるので、1行のみで使用すること。