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) ||
4 回复

看下你的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设置对象属性时崩溃,可能是由于以下原因:

  1. 对象未正确初始化:在设置属性之前,对象必须通过napi_create_object正确创建并初始化。如果对象未初始化或为空,调用napi_set_named_property会导致崩溃。

  2. 属性名或值无效:napi_set_named_property要求属性名和值必须是有效的napi_value。如果属性名或值为空或未正确转换为napi_value,可能会导致崩溃。

  3. 作用域问题:napi_set_named_property需要在正确的作用域内调用,确保对象和属性在调用时仍然有效。如果对象或属性在作用域外被释放,调用时会导致崩溃。

  4. 线程安全问题:如果在非主线程中调用napi_set_named_property,可能会导致崩溃。确保在创建和操作对象时,调用发生在主线程或使用线程安全的API。

  5. 内存管理问题:如果内存管理不当,如未正确释放对象或属性,可能会导致崩溃。确保在使用完对象和属性后,正确释放相关资源。

  6. API版本兼容性:确保使用的napi API版本与当前HarmonyOS版本兼容。不兼容的API版本可能导致未定义行为或崩溃。

  7. 调试信息不足:崩溃时,查看调试日志或使用调试工具(如lldb)可以获取更多信息,帮助定位问题。

检查上述原因,确保对象、属性名、值、作用域、线程安全和API版本都正确无误,可以避免napi_set_named_property崩溃。

在HarmonyOS鸿蒙Next中,如果在Native侧构建一个napi_value对象后调用napi_set_named_property时崩溃,可能的原因包括:

  1. 内存管理问题:确保napi_value对象已正确创建且未被释放。
  2. 属性名错误:检查属性名是否为有效的C字符串。
  3. 对象类型不匹配:确保目标对象是napi_object类型。
  4. 环境上下文错误:确保在正确的napi_env上下文下操作。

建议检查以上几点,并使用调试工具定位具体崩溃原因。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!