HarmonyOS鸿蒙Next中C++调用ArkTS单例对象方法,执行得到结果后crash了

HarmonyOS鸿蒙Next中C++调用ArkTS单例对象方法,执行得到结果后crash了

c++调用Arkts单例对象方法,执行得到结果后crash了

void callAdd(napi_env env) {
  napi_value argv1 = nullptr;
  napi_create_int32(env, 10, &argv1);
  napi_value argv2 = nullptr;
  napi_create_int32(env, 10, &argv2);
  napi_value argv[2];
  argv[0] = argv1;
  argv[1] = argv2;
  napi_value result = nullptr;
  napi_value ref;
  napi_get_reference_value(env, testInstanceReference, &ref);
  napi_value addFunc;
  napi_get_named_property(env, ref, "add", &addFunc);
  // native方法中调用ArkTS function,其返回值保存到result中并返回到ArkTS侧
  napi_call_function(env, nullptr, addFunc, 2, argv, &result);
  int resultInt;
  napi_get_value_int32(env, result, &resultInt);
  OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Init", "callAdd result=%{public}d", resultInt);
}

更多关于HarmonyOS鸿蒙Next中C++调用ArkTS单例对象方法,执行得到结果后crash了的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
import testNapi from 'libentry.so';

@Entry
@Component
struct Index {
    @State message: string = 'Hello World';
    //private resmgr = getContext().resourceManager; // 获取js的资源对象

    build() {
        Row() {
            Column() {
                Text(this.message)
                    .fontSize(50)
                    .fontWeight(FontWeight.Bold)
                    .onClick(() => {
                        testNapi.addSync(3, 4, (result) => {
                            this.message = `result is ${result}`
                        });
                    })
            }
            .width('100%')
        }
        .height('100%')
    }
}

export const addSync: (a: number, b: number, callback: (result: number) => void) => number;
static napi_value AddSync(napi_env env, napi_callback_info info) {
size_t requireArgc = 3;
size_t argc = 3;
napi_value args[3] = { nullptr };
napi_value context = nullptr;

napi_get_cb_info(env, info, &argc, args, &context, nullptr);

SampleTheread();

napi_valuetype valuetype0;
napi_typeof(env, args[0], &valuetype0);

napi_valuetype valuetype1;
napi_typeof(env, args[1], &valuetype1);

double value0;
napi_get_value_double(env, args[0], &value0);

double value1;
napi_get_value_double(env, args[1], &value1);

napi_value callBackArg[1] = { nullptr };
napi_create_double(env, value0 + value1, &callBackArg[0]);

napi_value sum;
napi_call_function(env, context, args[2], 1, callBackArg, &sum);

return sum;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
    { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr },
    { "addSync", nullptr, AddSync, nullptr, nullptr, nullptr, napi_default, nullptr },
    { "getRawFileContent", nullptr, GetRawFileContent, nullptr, nullptr, nullptr, napi_default, nullptr }
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END

jscrash 是因为调用callAdd的函数无返回值

更多关于HarmonyOS鸿蒙Next中C++调用ArkTS单例对象方法,执行得到结果后crash了的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,C++调用ArkTS单例对象方法后crash,可能是由于以下几个原因:

  1. 内存管理问题:C++和ArkTS之间的内存管理机制不同,C++需要手动管理内存,而ArkTS使用自动垃圾回收机制。如果在C++中未正确处理ArkTS对象的生命周期,可能导致内存泄漏或访问已释放的内存,从而引发crash。

  2. 线程安全问题:如果C++代码在非主线程中调用ArkTS单例对象的方法,而ArkTS单例对象的方法未设计为线程安全,可能导致数据竞争或不一致状态,进而引发crash。

  3. 类型转换错误:在C++与ArkTS之间传递数据时,如果类型转换不正确,可能导致未定义行为。例如,C++中传递的指针类型不匹配ArkTS期望的类型,可能导致访问非法内存地址。

  4. ArkTS对象状态异常:如果ArkTS单例对象在执行方法时处于异常状态(如未初始化或已销毁),C++调用该方法可能引发crash。

  5. 回调函数问题:如果C++通过回调函数与ArkTS交互,回调函数的实现可能存在问题,如未正确处理返回值或异常情况,导致程序崩溃。

  6. API使用不当:C++调用ArkTS API时,如果参数传递错误或未遵循API的使用规范,可能导致程序崩溃。

  7. 资源释放问题:如果C++在调用ArkTS方法后未正确释放相关资源(如文件句柄、网络连接等),可能导致资源耗尽或程序崩溃。

  8. 跨语言调用开销:C++与ArkTS之间的跨语言调用可能带来额外的开销,如果调用频率过高或处理的数据量过大,可能导致程序性能下降甚至崩溃。

建议检查C++代码中对ArkTS单例对象的调用方式,确保内存管理、线程安全、类型转换等方面没有问题。同时,确保ArkTS单例对象的状态正常,API使用正确,资源释放及时。如果问题依然存在,可能需要进一步分析日志或使用调试工具定位问题。

在HarmonyOS鸿蒙Next中,C++调用ArkTS单例对象方法时出现crash,可能的原因包括:

  1. 线程安全问题:确保单例对象在跨语言调用时是线程安全的。
  2. 内存管理问题:检查C++和ArkTS之间的内存管理,确保没有内存泄露或非法访问。
  3. 数据类型不匹配:确保传递的参数类型和返回值类型在C++和ArkTS之间是兼容的。
  4. 异常处理:确保在C++中正确处理ArkTS抛出的异常。

建议使用调试工具检查具体崩溃点,并确保接口调用符合鸿蒙的跨语言调用规范。

回到顶部