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
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,可能是由于以下几个原因:
-
内存管理问题:C++和ArkTS之间的内存管理机制不同,C++需要手动管理内存,而ArkTS使用自动垃圾回收机制。如果在C++中未正确处理ArkTS对象的生命周期,可能导致内存泄漏或访问已释放的内存,从而引发crash。
-
线程安全问题:如果C++代码在非主线程中调用ArkTS单例对象的方法,而ArkTS单例对象的方法未设计为线程安全,可能导致数据竞争或不一致状态,进而引发crash。
-
类型转换错误:在C++与ArkTS之间传递数据时,如果类型转换不正确,可能导致未定义行为。例如,C++中传递的指针类型不匹配ArkTS期望的类型,可能导致访问非法内存地址。
-
ArkTS对象状态异常:如果ArkTS单例对象在执行方法时处于异常状态(如未初始化或已销毁),C++调用该方法可能引发crash。
-
回调函数问题:如果C++通过回调函数与ArkTS交互,回调函数的实现可能存在问题,如未正确处理返回值或异常情况,导致程序崩溃。
-
API使用不当:C++调用ArkTS API时,如果参数传递错误或未遵循API的使用规范,可能导致程序崩溃。
-
资源释放问题:如果C++在调用ArkTS方法后未正确释放相关资源(如文件句柄、网络连接等),可能导致资源耗尽或程序崩溃。
-
跨语言调用开销:C++与ArkTS之间的跨语言调用可能带来额外的开销,如果调用频率过高或处理的数据量过大,可能导致程序性能下降甚至崩溃。
建议检查C++代码中对ArkTS单例对象的调用方式,确保内存管理、线程安全、类型转换等方面没有问题。同时,确保ArkTS单例对象的状态正常,API使用正确,资源释放及时。如果问题依然存在,可能需要进一步分析日志或使用调试工具定位问题。
在HarmonyOS鸿蒙Next中,C++调用ArkTS单例对象方法时出现crash,可能的原因包括:
- 线程安全问题:确保单例对象在跨语言调用时是线程安全的。
- 内存管理问题:检查C++和ArkTS之间的内存管理,确保没有内存泄露或非法访问。
- 数据类型不匹配:确保传递的参数类型和返回值类型在C++和ArkTS之间是兼容的。
- 异常处理:确保在C++中正确处理ArkTS抛出的异常。
建议使用调试工具检查具体崩溃点,并确保接口调用符合鸿蒙的跨语言调用规范。

