簡體   English   中英

EM_JS:如何將 int argc、char **argv 轉換為 JS 字符串數組?

[英]EM_JS: How to convert int argc, char **argv to a JS array of strings?

我正在嘗試從 C/C++ 調用 JS function,並使用字符串數組作為參數。

這是我的示例代碼:

main.c:

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

EM_JS(void, call_myFunc, (int argc, char **argv), {
     
    var arr = [];
    for (let i = 0; i < argc; i++) {
      arr.push(UTF8ToString(argv[i]));
    }
    myFunc(arr);
});

int main()
{
    int argc = 4;
    char *argv[5] = { "ab", "cd", "ef", "gh" };
    call_myFunc(argc, argv);
}

索引.html:

<!DOCTYPE html>
<html>

<head>
</head>

<body>
  <script>
  function myFunc(args) {
    console.log(args);
  }
  </script>
  <script async src="main.js"></script>
</body>

</html>

建造:

emcc main.c -o main.html

結果我得到:

["", "", "", ""]

我想要的結果:

["ab", "cd", "ef", "gh"]

如何正確地將char **argv轉換為 JS 字符串數組?

如何正確地將char **argv轉換為 JS 字符串數組?

emscripten.h的文檔中:

以空結尾的 C 字符串也可以傳遞給EM_JS函數,但要對其進行操作,需要將它們從堆中復制出來以轉換為高級 JavaScript 字符串。

EM_JS(void, say_hello, (const char* str), {
  console.log('hello ' + UTF8ToString(str));
}

以同樣的方式,指向任何類型的指針(包括void * )都可以在EM_JS代碼中傳遞,它們像上面的char *指針一樣顯示為整數。 可以通過直接讀取堆來管理訪問數據。

EM_JS(void, read_data, (int* data), {
  console.log('Data: ' + HEAP32[data>>2] + ', ' + HEAP32[(data+4)>>2]);
});

int main() {
  int arr[2] = { 30, 45 };
  read_data(arr);
  return 0;
}

因此,您可以像這樣使用HEAP32UTF8ToString

main.c

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

EM_JS(void, call_myFunc, (const int argc, const char** argv), {
    var arr = [];
    for (let i = 0; i < argc; i++) {
        const mem = HEAP32[(argv + (i * 4)) >> 2];
        const str = UTF8ToString(mem);
        arr.push(str);
    }
    console.log(arr);
});

int main() {
    const int argc = 4;
    const char* argv[] = { "ab", "cd", "ef", "gh" };
    call_myFunc(argc, argv);
    return 0;
}

編譯:

emcc main.c -o main.html

使用node運行:

node main.js

Output:

[ 'ab', 'cd', 'ef', 'gh' ]

暫無
暫無

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

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