HarmonyOS 鸿蒙Next C++与js的字符串转换时出错

发布于 1周前 作者 sinazl 来自 鸿蒙OS

我需要将从cpp代码中获取的字符串转给js(实际上是ArkTS)中使用,但在调用函数时出错,错误返回:20092-15164 A0c0d0/JSAPP E 出错:TypeError: is not callable

经过测试发现,除ArkTS提供给我的add加法示例函数外,我在cpp下另添加的函数都会调用失败“TypeError: is not callable”;

随后我将上面函数实现的具体内容迁移至add示例函数内,发现函数可以调用成功,但值仍然不对,为“json:undefined”

另外我发现DevEco Studio IDE有报致命错误,不知是否跟此问题相关:

cke_5285.png

cke_6788.png

cke_7426.png

cke_57770.png

cke_78309.png


更多关于HarmonyOS 鸿蒙Next C++与js的字符串转换时出错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复
  1. “除ArkTS提供给我的add加法示例函数外,我在cpp下另添加的函数都会调用失败“TypeError: is not callable””

是不是没有在cpp的Init函数中定义testString函数?

  1. 和你一样的代码,但是我这边运行时正常的,真机和模拟器都是,区别在于我在NAPI_Global_testString中加了以下代码,但是我试了不加也是正常的
size_t argc = 0;
napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);

你的IDE版本号是多少呢,我是Build Version: 5.0.5.310的

更多关于HarmonyOS 鸿蒙Next C++与js的字符串转换时出错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


一、DevEco Studio IDE版本号为5.0.5.315

二、在napi_init.cpp文件中的Init函数中已定义相关对照,由于我重装了IDE之前代码已删除,用addTest函数代替测试,问题仍然存在,详见如下:

(1)调用,在Index.ets文件中调用addTest函数:

console.log("4 * 5 =" + testNapi.addTest(4, 5));

(2)声明,在Index.d.ts文件中声明addTest函数:

export const addTest: (a: number, b: number) => number;

(3)注册表,在napi_init.cpp文件内Init函数中建立对照,我使用IDE自动生成,这部分未人工干预:

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},
        {"addTest", nullptr, NAPI_Global_addTest, nullptr, nullptr, nullptr, napi_default, nullptr }
    };
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END

(4)实现,同在(3)的文件中实现addTest的对应函数NAPI_Global_addTest:

static napi_value NAPI_Global_addTest(napi_env env, napi_callback_info info) {
    size_t argc = 2;
    napi_value args[2] = {nullptr};
    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
    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 sum;
    napi_create_double(env, value0 * value1, &sum); // 其他代码同add函数,仅这行的'+' -> '*'
    return sum;
}

(5)结果,同先前的结果一样:

E     [Engine Log]Lifetime: 0.000000s
E     [Engine Log]Js-Engine: ark
E     [Engine Log]page: pages/Index.js
E     [Engine Log]Error message: is not callable
E     [Engine Log]Stacktrace:
E     [Engine Log]    at func_main_0 (entry/src/main/ets/pages/Index.ets:5:23)

项目名称

  • 项目类型:前端
  • 语言:HTML, CSS, JavaScript
  • 简介:这是一个简单的HTML页面,展示如何使用Markdown语法。

图片示例

图片示例

抱歉,上面的(1)(2)(3)(4)就是最小测试程序,但因为[1][2][3、4]分别归属在不同的文件中所以无法合并,我做的所有操作都在上述4点中提到,除此之外没有做其他更改,

在HarmonyOS鸿蒙系统中,Next版本在进行C++与JavaScript(JS)之间的字符串转换时,若遇到错误,通常可能是由于跨语言接口调用时的数据格式不匹配或编码问题。

  1. 确保数据格式一致:在C++侧,确保传递给JS的字符串是以UTF-8或系统约定的编码格式进行编码。在JS侧接收时,也应以相应格式解码。

  2. 检查接口文档:参考鸿蒙官方文档,确保使用的接口支持当前的数据类型转换。例如,通过JNI(Java Native Interface,虽不涉及Java代码,但概念类似)或JSI(JavaScript Interface)进行交互时,应严格遵守接口规范。

  3. 异常处理:在C++和JS代码中增加异常处理逻辑,捕获并处理可能的转换错误,这有助于定位问题。

  4. 日志记录:在转换前后增加日志记录,记录字符串的原始值和转换后的值,便于问题追踪。

  5. 版本兼容性:确认鸿蒙系统版本与使用的开发库版本兼容,避免因版本差异导致的问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。在此平台上,你可以获得更专业的技术支持和解决方案。

回到顶部