emscripten、 WebAssembly,傳遞字串給c函式

xuanhun發表於2018-11-15

下面看具體的例項。

下面的程式碼是一個C函式,實現簡單的字串拼接,然後返回拼接的字串。

#include <stdio.h>
#include <string>
 char* EMSCRIPTEN_KEEPALIVE outName(char *n){    
 char xhName[] = "xuanhun";   
 strcat(n, xhName);   
 return n;
}

下面使用命令進行編譯:

emcc hello.cc -o test2.js

然後在頁面中引用:

 <script>
        Module = {};
        Module.onRuntimeInitialized = function () {
        
            var ptr = allocate(intArrayFromString("玄魂"), 'i8', ALLOC_NORMAL);

            var retPtr = Module._outName(ptr);

            var resValue = Pointer_stringify(retPtr);
            console.log(resValue);

            _free(ptr);

        }
    </script>
    <script src="test2.js"></script>

上面的程式碼我們核心部分逐行分析一下:

  var ptr = allocate(intArrayFromString("玄魂"),   'i8', ALLOC_NORMAL);

上面的intArrayFromString方法,將字串轉換為UTF8的char陣列,然後allocate 方法開闢記憶體空間儲存資料,返回指標。

 var retPtr = Module._outName(ptr);

呼叫C匯出函式,傳入字串指標。

 var resValue = Pointer_stringify(retPtr);

呼叫Pointer_stringify膠水函式,將c返回的指標轉換為字串。

   _free(ptr);

釋放記憶體。

下面檢視下執行結果:

image

WebAssembly程式設計實踐(1.4)膠水程式碼初探

WebAssembly程式設計實踐(1.3)膠水程式碼初探

WebAssembly程式設計實踐(1.2)Hello World!

WebAssembly程式設計實踐(1.1)安裝Emscripten

歡迎關注玄說前端公眾號

image

QQ群:850038125

相關文章