如何在C++;通过emscripten和javascript 我正在学习EnScript,在传递C++和JS之间的字符串时,我甚至无法得到最基本的字符串操作。

如何在C++;通过emscripten和javascript 我正在学习EnScript,在传递C++和JS之间的字符串时,我甚至无法得到最基本的字符串操作。,javascript,c++,emscripten,Javascript,C++,Emscripten,例如,我想写一个字符串长度函数。在C++中: extern "C" int stringLen(std::string p) { return p.length(); } 从javascript调用为: var len = _stringLen("hi."); 这将为我产生0。我怎样才能使这项工作达到预期效果?我应该在这里使用哪种字符串类型字符常量*标准::wstring标准::字符串?似乎没有一个起作用;我总是得到非常随机的值 这只是开始。。。那么我如何从C++返回一个字符串? e

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

extern "C" int stringLen(std::string p)
{
    return p.length();
}
从javascript调用为:

var len = _stringLen("hi.");
这将为我产生
0
。我怎样才能使这项工作达到预期效果?我应该在这里使用哪种字符串类型<代码>字符常量*<代码>标准::wstring<代码>标准::字符串?似乎没有一个起作用;我总是得到非常随机的值

这只是开始。。。那么我如何从C++返回一个字符串?
extern "C" char *stringTest()
{
    return "...";
}
在JS中:

var str = _stringTest();
再一次,我找不到一种方法来实现这一目标;我总是在JS中收到垃圾

<我的问题是:我如何通过Emscripten来封JS和C++之间的字符串类型?< /P> < P> >一些想法:

  • 我调用方法的唯一方法是使用
    crwap
    ccall

    var length=Module.ccall('stringLen',['string'],'number')
  • 您是否将
    stringLen
    stringTest
    包含在您的
    EXPORTED\u函数
    参数中?
    emcc hello\u world.cpp-s导出的函数=[''字符串',''字符串测试']
  • 查看此处了解更多详细信息:

    或者我的hello_world教程:

    希望这能有所帮助。

    外部“C”无法识别std::string

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

    样本测试代码:
    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>
    
    
    你好,世界!
    var strLenFunction=Module.cwrap('stringLen','number',['string']);
    变量len1=strLenFunction(“hi.”);//警报3
    警报(len1);
    var len2=strLenFunction(“Hello World”);//警报11
    警报(len2);
    <代码> > p>如果使用具有函数的外部“C”,则不能在其签名中使用C++类型。

    因此,如果您想使用std::string,那么可以使用“Embind”或“WebIDL绑定器”。提及

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

    另外,我不知道如何在这里通过引用传递变量,所以是通过值来传递的

    // 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时


    <> P>在C++中,你可以在J++堆上做一个Malc,然后做操作,但是上面的方法应该更容易。

    这不能回答如何把C++和C++的字符串都传递出去的完整问题。“如果你使用ExtN”C,带有一个函数,你就不能在它的签名中使用C++类型。我看到两个答案都声称这一点,但我不认为这是真的。AFAIK这只是一个防止名称混乱的链接规范。我可以编译
    extern“C”void foo(std::string s){std::cout
    
    // 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);
    }
    
    var myStr = "TestString";
    Module.MyStrLen(myStr);