13

我正在学习 emscripten,在 C++ 和 JS 之间传递字符串时,我什至无法进行最基本的字符串操作。

例如,我想写一个字符串长度函数。在 C++ 中:

extern "C" int stringLen(std::string p)
{
    return p.length();
}

从javascript调用为:

var len = _stringLen("hi.");

0对我来说是有效的。我如何使这项工作按预期进行?我应该在这里使用哪种字符串类型?char const*? std::wstring? std::string? 似乎没有一个工作;我总是得到相当随机的值。

这只是开始......然后我如何从 C++ 中返回一个这样的字符串?

extern "C" char *stringTest()
{
    return "...";
}

在 JS 中:

var str = _stringTest();

再一次,我无法找到一种方法来完成这项工作。我总是在 JS 中得到垃圾。

所以我的问题很清楚:如何通过 Emscripten 在 JS 和 C++ 之间编组字符串类型?

4

3 回答 3

12

extern "C" 不能识别 std::string。

你可能想试试这个:
Test.cpp

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

extern "C" int stringLen(char* p)
        {
            return strlen(p);
        }

使用以下命令编译 cpp 代码:

emcc Test.cpp -s EXPORTED_FUNCTIONS="['_stringLen']

示例测试代码:
Test.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Hello World !</title>
        <script src="a.out.js"></script>
        <script>
             var strLenFunction =  Module.cwrap('stringLen', 'number', ['string']);
             var len1 = strLenFunction("hi.");  // alerts 3
             alert(len1);
             var len2 = strLenFunction("Hello World"); // alerts 11
             alert(len2);
        </script>
    </head>
</html>
于 2014-08-26T04:09:44.827 回答
7

如果将 extern "C" 与函数一起使用,则不能在其签名中使用 C++ 类型。

所以如果你想使用std::string,那么你可以使用“Embind”或“WebIDL Binder”。参考这里

我更喜欢 embind,所以这是您的问题的示例代码。

PS我不确定如何在这里通过引用传递变量,所以按值传递。

// This is your routine C++ code
size_t MyStrLen(std::string inStr) {
    return inStr.length();
}

// This is the extra code you need to write to expose your function to JS
EMSCRIPTEN_BINDINGS(my_module) {
    function("MyStrLen", &MyStrLen);
}

现在在 JS 中你需要做的就是:

var myStr = "TestString";
Module.MyStrLen(myStr);

确保你通过标志

--绑定

调用 emcc 时。

还有另一种方法,您可以从 JS 在 C++ 堆上执行 Malloc,然后进行操作,但上述方法应该更容易。

于 2016-07-07T04:18:58.363 回答
2

一些想法:

  1. 我调用方法的唯一方法是使用crwapor ccall?
    var length = Module.ccall('stringLen', ['string'], 'number');
  2. 您是否在参数中包含stringLen和?stringTestEXPORTED_FUNCTIONS
    emcc hello_world.cpp ... -s EXPORTED_FUNCTIONS=['_stringLen','_stringTest']

在这里查看更多详细信息:http:
//kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html

或者我的 hello_world 教程:
http ://www.brightdigit.com/hello-emscripten/

希望这会有所帮助。

于 2014-04-02T13:32:16.910 回答