我不太确定您的用例,但您缺少使用您的函数的重要步骤testExternalJSMethod
。您在这里有两个选择:
选项 1 - 图书馆
1 - 在 c/c++ 中定义函数。
extern void testExternalJSMethod();
2 - 创建一个名为myLibrary.js
3 - 需要添加JS函数LibraryManager
在您的库文件中使用以下代码:
function makeAlert(text) {
alert(text);
}
if (typeof mergeInto !== 'undefined') mergeInto(LibraryManager.library, {
testExternalJSMethod: function() {
makeAlert("Hello world");
}
});
4 - If testExternalJSMethod
取决于其自身范围之外的任何事物(例如,makeAlert
上面),请确保在您的 html 页面中包含该脚本
<script async type="text/javascript" src="myLibrary.js"></script>
5 - 添加选项--js-library
到您的 emcc 命令,并紧接在相对路径之后myLibrary.js
emcc ... --js-library myLibrary.js
选项 2 - 传递指针
1 - 在 c/c++ 中定义 javascript 函数类型
typedef void testExternalJSMethod()
2 - 无论您希望在何处使用此函数,都接受一个 int 参数(该参数将作为函数指针),并将指针强制转换为您的函数
void passFnPointer(int ptr) {
((testExternalJSMethod*)ptr)();
}
3 - 使用 emscripten 的addFunction()
并存储其返回值(c/c++中的指针)
var fnPtr = Module.addFunction(function () {
alert("You called testExternalJSMethod");
});
4 - 使用步骤 3 中存储的指针值传递给我们的函数passFnPointer
var passFnPointer = Module.cwrap('passFnPointer', 'undefined', ['number']);
passFnPointer(fnPtr);
5 - 添加选项-s RESERVED_FUNCTION_POINTERS
到你的 emcc 命令
emcc ... -s RESERVED_FUNCTION_POINTERS=10