Emscripten和jquery点击回调,问题?

时间:2016-12-15 13:40:52

标签: jquery callback click emscripten

我在这里举了一个完整的例子,我不知道这是不是正确的方法! 完善:

emcc jquery001.cpp -o jquery001.js -s EXPORTED_FUNCTIONS="['_x_click','_webmain']"
似乎一切都很好,程序运行良好,但... printf 显示总是不是最后一个printf而是prev

初始输出:

pre-main prep time: 11 ms
jquery001.js:143 
jquery001.js:143  enter webmain
jquery001.js:143  webmain <>

退出网站主页是missig:printf(&#34; \ n退出webmain&#34;);

然后点击&#39;在元素示例上显示:

exit webmain
jquery001.js:143  enter x_click
jquery001.js:143  x_click event <x1>

printf退出web主...但不是printf(&#34; \ n退出x_click&#34;);

出了什么问题?

[jquery001.html]

<!DOCTYPE html>
<html>
<head>
<title>emcc & jquery</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<label id="x1" class="x" >emscripten1</label>
<label id="x2" class="x" >emscripten2</label>
</body>
<script src="jquery001.js"></script>
<script>
Module.ccall('webmain', 'number', ['string'],['']);
</script>
</html>

[jquery001.cpp]

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

#include <string>

extern "C"
{
    int x_click(  char *s ) 
    {
      printf ( "\n enter x_click");
      printf ( "\n x_click event <%s>",s );
      printf ( "\n exit x_click");
      return 0 ;
    }


    int webmain( char *s ) 
    {
        printf ( "\n enter webmain");       
        printf ( "\n webmain <%s>",s);

        int x = EM_ASM_INT({

         $('.x').click(function(e)
         {
             Module.ccall('x_click', 'number', ['string'],[e.target.id]);

         });


          return 0;
        }, NULL);   

        printf ( "\n exit webmain");    

        return 0 ;
    }

}


int main ( void )
{

    return 0 ;
}

1 个答案:

答案 0 :(得分:1)

Emscripten通过缓冲传递给printf的参数来处理输出,直到它到达换行符,此时该字符串被传递给Module.print()方法,该方法处理显示输出。这样做的结果是,如果将一个字符串传递给printf并且不以换行符结尾,那么它就不会被打印出来。

这类似于stdout在C中的缓冲方式,但与Emscripten(至少我测试过的版本1.36)的区别在于调用fflush(NULL)不会刷新缓冲区,{ {1}}的缓冲方式与stderr相同。

纠正你的问题很简单,你只需要通过在最终字符串末尾添加换行符来刷新缓冲区,即:

stdout

printf("\n exit x_click\n");