簡體   English   中英

如何使用 webassembly/emscripten 在 javascript 和 C/C++ 代碼之間傳遞字符串數組?

[英]How to pass array of strings between javascript and C/C++ code with webassembly/emscripten?

我正在嘗試編寫一個 web 應用程序,它將使用后端 C/C++ 代碼進行某種文字處理(比如拼寫檢查、語法檢查、單詞分析)。 (我有 c/C++ 代碼在另一個桌面應用程序中工作......我想把它帶到網絡上)。 我想要一個執行此操作的示例最小代碼(將字符串數組從 JavaScript 傳遞到 c/c++ 代碼......c/c++ 代碼將執行單詞操作......我有這個代碼......以及結果數組字符串將被發送回 JavaScript 在那里它們將被進一步處理。(傳遞arrays很重要)請指出我可以從那里開始的任何此類代碼/教程。

我搜索了 GitHub。 我發現了幾個使用 emscripten 的項目,但在任何地方都找不到。 (我能得到一些線索的唯一地方是用 emscripten 構建的 Hunspell ......但是我無法成功構建它)

請告訴我。 提前致謝。

  • 將 function 導出到 C++ 項目中,該項目分配一定長度的字符數組,另一個用於處理其中的數據,另一個用於釋放數組 ZCD69B4957F06CD818D7BF3D61980E9
static char *string_buffer = NULL;
static size_t string_length = 0;

char * EMSCRIPTEN_KEEPALIVE string_start(size_t length) 
{ 
  // allocate one extra character for the terminator
  char *array = new char[length + 1];

  // friendly replace the current, if any
  if (string_buffer != NULL) delete[] string_buffer;

  // remember
  string_buffer = array;
  string_length = length;

  // done
  return string_buffer;
}

void EMSCRIPTEN_KEEPALIVE string_handle(size_t length)
{
  // sanity
  if (string_buffer == NULL || length > string_length) halt;

  // terminate
  string_buffer[length] = 0;

  // work with the string characters, store/process it 
}

void EMSCRIPTEN_KEEPALIVE string_final(void)
{
  // friendly
  if (string_buffer == NULL) return;

  // free
  delete[] string_buffer;

  // remember
  string_buffer = NULL;
}

  • 找到最長的字符串: max_string_length
  • 在 JavaScript 中分配一個要使用的緩沖區:
let string_pointer_offset = exports.string_allocate(max_string_length);
  • 在 JavaScript 中創建 wasm 實例 memory 的視圖:
let view = new Uint8Array(memory.buffer, string_pointer_offset, max_string_length);
  • 循環所有字符串,並為每個字符串將其寫入此view字節數組,假設 ASCII 字符的逐字節副本,長度為current_string_length
  • 調用exports.string_handle(current_string_length);
  • 處理完所有字符串后,調用exports.string_final(); 釋放字符串“傳輸緩沖區”的 memory 並處理您迄今為止傳輸的所有字符串(如果有)。

從 C++ 到 WASM 的方式是一樣的。 您可以使用 function 通過創建字符數組來開始“發送”並將指針(作為數字)返回到 JavaScript。 然后另一個 function 從 C++ 端和 JavaScript 端填充字節,它們是用view讀取的。 最后,再次釋放transfer buffer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM