其他答案没有解决如何从C++返回字符串的问题。以下是一种通过引用传递字符串从C++到JavaScript的方法。
Emscripten文档对使用cwrap/ccall(
emscripten docs)可以传递给C/C++函数的类型有以下说明:
引用:
这些类型包括“number”(对应于C整数、浮点数或通用指针的JavaScript数字)、“string”(对应于表示字符串的C char*的JavaScript字符串)或“array”(对应于C数组的JavaScript数组或类型化数组;对于类型化数组,它必须是Uint8Array或Int8Array)。
正如其他答案所指出的那样,你需要编写一个使用C字符串作为参数的C函数,因为这是emscripten API(而不是因为extern "C")。
如果你想返回一个字符串,你可能会认为你只需传递一个C字符串(实际上是通过引用传递,因为它是指针),然后修改该字符串:
extern "C" {
void stringTest(char* output) {
output[0] = 'H';
output[1] = 'i';
}
}
let stringTestFunction = Module.cwrap('stringTest', null, ['string']);
let output = "12";
stringTestFunction(output);
console.log(output);
然而,这种方法行不通,因为在传递给函数时会创建一个副本。所以,你需要显式地分配内存并传递一个指针。Emscripten提供了
allocateUTF8
和
UTF8ToString
函数来实现这个目的。
let stringTestFunction = Module.cwrap('stringTest', null, ['number']);
let output = "12";
let ptr = Module.allocateUTF8(output);
stringTestFunction(ptr);
output = Module.UTF8ToString(ptr);
Module._free(ptr);
console.log(output);
因为我们将字符串转换为字符指针,所以我们也可以直接调用函数而不使用(
emscripten docs):
Module._stringTest(ptr)
。这需要一些额外的步骤,但现在你已经成功将一个字符串从C传递到了JavaScript。
为了使这个示例工作,您可能需要使用以下标志进行编译:
-sEXPORTED_FUNCTIONS="['_stringTest','_malloc','_free']"
和
-sEXPORTED_RUNTIME_METHODS="['cwrap','allocateUTF8','UTF8ToString']"
。
还有更通用的方法来为其他类型的数组分配内存(
https://dev59.com/fGMm5IYBdhLWcg3wFL7s#23917034)。
UTF8ToString
。 - nitroglycerine