HarmonyOS鸿蒙Next中在Native侧构建一个object,之后设置napi_set_named_property崩溃
HarmonyOS鸿蒙Next中在Native侧构建一个object,之后设置napi_set_named_property崩溃
Reason: Signal: SIGSEGV(SEGV_MAPERR) @ 0x0002000053ed9538
Fault thread info:
- Tid: 42508, Name: nhe.ohos.ispeak
#00 pc 0000000000596084 /system/lib64/platformsdk/libark_jsruntime.so(panda::ObjectRef::Set(panda::ecmascript::EcmaVM const*, char const*, panda::Localpanda::JSValueRef)+240)(0a5e5a08ab1e8b1f274b227e2dc8bb96) #01 pc 00000000000591b8 /system/lib64/platformsdk/libace_napi.z.so(napi_set_named_property+184)(6c8331a979d17201be8e85a9354da22a)
相关代码如下 :
```cpp
napi_value obj = nullptr;
if (napi_ok != napi_create_object(env, &obj)) {
OH_IS_FUN_LOG_STR(LOG_ERROR, "napi_create_object failed.");
return nullptr;
}
napi_value uid;
napi_create_int32(env, login_user_id, &uid)
// Set and assign values to the attributes.
if (napi_ok != napi_set_named_property(env, obj, "uid", uid) ||
看下你的arkts层的调用呢?
按照下面的方式,根据你的代码猜想你的意图,返回的ArkTS对象可以正常使用:
static napi_value ObjecTest(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);
int32_t login_user_id;
napi_get_value_int32(env, args[0], &login_user_id);
napi_value obj = nullptr;
if (napi_ok != napi_create_object(env, &obj)) {
OH_LOG_INFO(LOG_APP, "napi_create_object failed.");
return nullptr;
}
napi_value uid;
napi_create_int32(env, login_user_id, &uid);
if (napi_ok != napi_set_named_property(env, obj, "uid", uid)) {
OH_LOG_INFO(LOG_APP, "napi_set_named_property failed.");
return nullptr;
}
return obj;
}
napi_value Init函数加上:
{ "objectTest", nullptr, ObjecTest, nullptr, nullptr, nullptr, napi_default, nullptr },
Index.d.ts参考:
export const objectTest:(a: number) => object | void;
arkts调用:
hilog.info(0x0000, 'testTag', 'Test NAPI = %{public}s', JSON.stringify(testNapi.objectTest(16)));
更多关于HarmonyOS鸿蒙Next中在Native侧构建一个object,之后设置napi_set_named_property崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用napi_set_named_property
设置对象属性时崩溃,可能是由于以下原因:
-
对象未正确初始化:在设置属性之前,对象必须通过
napi_create_object
正确创建并初始化。如果对象未初始化或为空,调用napi_set_named_property
会导致崩溃。 -
属性名或值无效:
napi_set_named_property
要求属性名和值必须是有效的napi_value
。如果属性名或值为空或未正确转换为napi_value
,可能会导致崩溃。 -
作用域问题:
napi_set_named_property
需要在正确的作用域内调用,确保对象和属性在调用时仍然有效。如果对象或属性在作用域外被释放,调用时会导致崩溃。 -
线程安全问题:如果在非主线程中调用
napi_set_named_property
,可能会导致崩溃。确保在创建和操作对象时,调用发生在主线程或使用线程安全的API。 -
内存管理问题:如果内存管理不当,如未正确释放对象或属性,可能会导致崩溃。确保在使用完对象和属性后,正确释放相关资源。
-
API版本兼容性:确保使用的
napi
API版本与当前HarmonyOS版本兼容。不兼容的API版本可能导致未定义行为或崩溃。 -
调试信息不足:崩溃时,查看调试日志或使用调试工具(如
lldb
)可以获取更多信息,帮助定位问题。
检查上述原因,确保对象、属性名、值、作用域、线程安全和API版本都正确无误,可以避免napi_set_named_property
崩溃。
在HarmonyOS鸿蒙Next中,如果在Native侧构建一个napi_value
对象后调用napi_set_named_property
时崩溃,可能的原因包括:
- 内存管理问题:确保
napi_value
对象已正确创建且未被释放。 - 属性名错误:检查属性名是否为有效的C字符串。
- 对象类型不匹配:确保目标对象是
napi_object
类型。 - 环境上下文错误:确保在正确的
napi_env
上下文下操作。
建议检查以上几点,并使用调试工具定位具体崩溃原因。