是的,需要通过回调的方式实现,你可以参考以下示例代码实现您的需求:
1、在index.d.ts中链接ArkTS侧函数与C++侧函数:
export const nativeCallArkTS: (cb: (a: string) => string) => string;
2、在C++测调用ArkTS侧函数:
static napi_value NativeCallArkTS(napi_env env, napi_callback_info info) {
size_t argc = 1;
// 声明参数数组
napi_value args[1] = {nullptr};
// 获取传入的参数并依次放入参数数组中
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
// 创建一个string,作为ArkTS的入参
napi_value argv = nullptr;
napi_create_string_utf8(env, "yes", 3, &argv);
// 调用传入的callback,并将其结果返回
napi_value result = nullptr;
napi_call_function(env, nullptr, args[0], 1, &argv, &result);
return result;
}
3、将NativeCallArkTS接口导出:
EXTERN_C_END
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
{"nativeCallArkTS", nullptr, NativeCallArkTS, nullptr, nullptr, nullptr, napi_default, nullptr}
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
4、在ArkTS中调用函数:
import nativeFun from 'libentry.so';
@Entry
@Component
struct Index {
@State message: string = 'nativeCallArkTS';
build() {
Row() {
Column() {
Text(this.message)
.onClick(() => {
this.message += nativeFun.nativeCallArkTS((a: string)=> {
return a })
})
}
.width('100%')
}
.height('100%')
}
}
您可以在C++侧定义一个string类型的变量存储动态接收的字符串,并在将其转换成char*类型后传入napi_create_string_utf8
std::string str = "HelloArkTS";
const char* str1 = str.c_str();
napi_create_string_utf8(env, str1, sizeof(str), &argv);
参考文档:Node-API支持的数据类型和接口-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者
env在不同线程间是不共享的,因此需要在每个线程中使用独立的env实例。