这是 C++ 代码:
PTR(LoadResult) CommonSchemeOutJumpProxy::HandByOutLaunch(PTR(Scene) page, std::string url, std::string scheme) {
auto js_func = aki::JSBind::GetJSFunction("predictOutDomainLaunch");
// auto target = std::static_pointer_cast<CRVOhos::CRVPageMirror>(page)->GetTsMirrorRef();
if (js_func != nullptr) {
XLOG(INFO) << TAG << "HandByOutLaunch: " << url;
// promise;;
std::promise<PTR(LoadResult)> outlaunch_promise;
// 启动线程触发 rpc;
aki::TaskRunner::PostTask("main", [&]() {
// callback
std::function<void(int, std::string)> callback = [&](int type, std::string url) {
XLOG(INFO) << TAG << "HandByOutLaunch: child thread notify";
auto loadResultPtr = std::make_shared<LoadResult>();
loadResultPtr->type = LoadResult::NumberToLoadResultType(type);
loadResultPtr->redirect_url = url;
outlaunch_promise.set_value(loadResultPtr);
};
XLOG(INFO) << TAG << "HandByOutLaunch: start predictOutDomainLaunch in child thread";
// predictOutDomainLaunch
js_func->Invoke<void>(url, callback);
});
// wait for
auto loadResultPtr = outlaunch_promise.get_future().get();
XLOG(INFO) << TAG << "HandByOutLaunch: get the loadResult: " << loadResultPtr->type << ", redirect_url: " << loadResultPtr->redirect_url;
return loadResultPtr;
} else {
return nullptr;
}
这是 JS 层代码:
// 注册外跳 OutDomain 接口;;
aki.JSBind.bindFunction('predictOutDomainLaunch', (url: string, OutDomainLaunchListener: (type: number, url: string) => void): void => {
hilog.info(0x0000, 'OutLaunch-predictOutDomainLaunch', 'start out launch: %{public}s', JSON.stringify(url));
setTimeout(() => {
OutDomainLaunchListener(2, "") // redirect;
}, 5 * 1000);
});
然后启动后会闪退!
可查看此示例文档:
https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-ndk-development-V5\#section17207123411106