如何在C++;通过emscripten和javascript 我正在学习EnScript,在传递C++和JS之间的字符串时,我甚至无法得到最基本的字符串操作。
例如,我想写一个字符串长度函数。在C++中:如何在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
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);