【每日学点鸿蒙知识】多个har依赖、指定编译架构、ArkTS与C++互相调用

1、关于多个har依赖问题?

harA依赖harB和harC,harB依赖harC,这种关系如何构建依赖呢?

  1. 直接依赖和间接依赖都上远程仓库,采取版本号形式依赖。
  2. 如果不上远程仓库,推荐使用:直接依赖和间接依赖的har包都获取了放到工程中,用overrides指向工程中的har包路径。
  3. 如果子依赖是本地har依赖,则需要放到直接依赖的模块里面去依赖然后构建出.har给其他工程用例如:A依赖B.har,B.har依赖C.har,那么构建B.har的时候,C.har需要放到B模块中去依赖构建出B.har。

2、如何指定或判断当前编译架构?

指定编译架构:

  1. build-profile.json5文件中,增加abiFilters配置

    "externalNativeOptions": {
    "path": "./src/main/cpp/CMakeLists.txt",
    "arguments": "",
    "cppFlags": "",
    "abiFilters": [
    "arm64-v8a"
    ]
    }

  2. build-profile.json5文件的arguments或者命令行中,添加编译参数

    -DOHOS_ARCH=armeabi-v7a

判断编译架构:

CMakeList.txt中OHOS_ARCH宏表示当前编译架构

if (${OHOS_ARCH} STREQUAL "armeabi-v7a")
message('armeabi-v7a')
elseif (${OHOS_ARCH} STREQUAL "arm64-v8a")
message('arm64-v8a')
else()
message("unkonow")
endif()

3、在启动调试或运行应用/服务时,安装HAP出现错误,提示"error: install failed due to grant request permissions failed"错误信息。

默认应用等级为normal,只能使用normal等级的权限,如果使用了system_basic或system_core等级的权限,将导致报错。

在UnsgnedDebugProfileTemplate.json文件中修改apl等级,调整成system_basic或system_core等级,重新签名打包即可。

4、如何实现ArkTS与C/C++的对象传递?

ArkTS调用C/C++:

  1. ArkTS类对象传递至NAPI侧;

  2. NAPI获取对象属性并输出;

  3. NAPI调用对象方法。

    // Animals类
    class Animals {
    name: string
    age: number

    constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
    }

    add(a: number, b: number): number {
    return a + b;
    }
    }

    // ArkTS传递对象中
    Button("TestObject")
    .onClick(() => {
    let ani:Animals = new Animals('Bob',5)
    testNapi.TestObject(ani)
    })

    // NAPI接受对象并处理
    static napi_value TestObject(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);

    napi_value name, age;
    napi_get_named_property(env, args[0], "name", &name);
    napi_get_named_property(env, args[0], "age", &age);

    size_t itemLength;
    napi_get_value_string_utf8(env, name, nullptr, 0, &itemLength);
    char *str = new char[itemLength + 1];
    napi_get_value_string_utf8(env, name, &str[0], itemLength + 1, &itemLength);
    OH_LOG_INFO(LOG_APP, "name is %{public}s", str);
    uint32_t num;
    napi_get_value_uint32(env, age, &num);
    OH_LOG_INFO(LOG_APP, "age is %{public}d", num);

    napi_value add;
    napi_get_named_property(env, args[0], "add", &add);

    // 创建参数数组
    napi_value arr[2];
    napi_create_int32(env, 10, &arr[0]);
    napi_create_int32(env, 5, &arr[1]);

    napi_value result;
    uint32_t res;
    napi_call_function(env, args[0], add, 2, arr, &result);
    napi_get_value_uint32(env, result, &res);
    OH_LOG_INFO(LOG_APP, "res is %{public}d", res);

    return nullptr;
    }

C/C++调用ArkTS:

  1. ArkTS侧传递回调方法到NAPI侧;

  2. NAPI创建napi_value指针类型的对象作为参数传递到回调方法;

  3. ArkTS调用回调方法获取NAPI侧传入的参数并做修改;

  4. NAPI侧获取修改后的参数并输出。

    Button("CallbackToArkTs")
    .onClick(() => {
    let da: Record<string, number> = testNapi.CallbackToArkTs((value: object) => {
    let data: Record<string, number> = value as Record<string, number>;
    console.info("修改前type: " + data["type"].toString())
    console.info(JSON.stringify(value))
    data["type"] += 10
    return value;
    });
    console.info(JSON.stringify(da))
    })

    static bool Napi_AddPropertyInt32(napi_env env, napi_value obj, const char *key, int32_t value) {
    napi_value key_napi = nullptr;
    napi_status status = napi_create_string_utf8(env, key, NAPI_AUTO_LENGTH, &key_napi);

    napi_value value_napi = nullptr;
    status = napi_create_int32(env, value, &value_napi);
    status = napi_set_property(env, obj, key_napi, value_napi);
    return true;
    }

    static napi_value CallbackToArkTs(napi_env env, napi_callback_info info) {

    // 获取ArkTS参数
    size_t argc = 1;
    napi_value js_cb = nullptr;
    napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);

    // native回调到ts层的object
    napi_value argv = nullptr;
    napi_create_object(env, &argv);
    Napi_AddPropertyInt32(env, argv, "type", 1);
    Napi_AddPropertyInt32(env, argv, "index", 2);

    // native回调到ts层
    napi_value result = nullptr;
    napi_call_function(env, NULL, js_cb, 1, &argv, &result);

    // 获取ts修改后的object
    napi_value typeNumber = nullptr;
    napi_get_named_property(env, result, "type", &typeNumber);
    int32_t number;
    napi_get_value_int32(env, typeNumber, &number);
    OH_LOG_INFO(LOG_APP, "修改后type: %{public}d", number);

    // 返回修改后的object
    return result;
    }

5、List水平布局如何根据内容自适应高度?

怎么解决List组件中ListItem水平布局,list高度不会根据内容自适应?

可以通过垂直Scroll组件嵌套水平List实现List自适应子节点高度。

@Entry
@Component
struct Index {
  build() {
    Column() {
      Flex() {
        // 嵌套Scroll组件使水平布局的list组件高度自适应内容
        Scroll() {
          List() {
            ListItem() {
              Text('测试1')
            }
            .backgroundColor(Color.Red)
            .height(80)

            ListItem() {
              Text('测试2')
            }
            .backgroundColor(Color.Gray)
            .height(80)

            ListItem() {
              Text('测试3')
            }
            .backgroundColor(Color.Yellow)
            .height(80)

            ListItem() {
              Text('测试4')
            }
            .backgroundColor(Color.White)
            .height(80)
          }
          .listDirection(Axis.Horizontal)
          .alignListItem(ListItemAlign.Center)
          .scrollBar(BarState.Off)
          .backgroundColor(Color.Blue)
        }
      }
      .backgroundColor(Color.Green)
      .width('100%')
      .height('200')
    }

  }
}
相关推荐
weixin_399264292 小时前
QT c++ 样式 设置 标签(QLabel)的渐变色美化
开发语言·c++·qt
吾当每日三饮五升5 小时前
C++单例模式跨DLL调用问题梳理
开发语言·c++·单例模式
猫武士水星5 小时前
C++ scanf
开发语言·c++
捕鲸叉6 小时前
QT自定义工具条渐变背景颜色一例
开发语言·前端·c++·qt
Rossy Yan7 小时前
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
c++·排序算法·面向对象·封装·查找
我搞slam7 小时前
全覆盖路径规划算法之BCD源码实现(The Boustrophedon Cellular Decomposition)
c++·算法·图搜索算法
Rossy Yan7 小时前
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
开发语言·数据结构·c++·算法·查找·头歌实践教学平台·合集
zhgjx_chen8 小时前
ENSP综合实验(中小型网络)
服务器·网络·华为
塞尔维亚大汉8 小时前
移植案例与原理 - startup子系统之bootstrap_lite服务启动引导部件(1)
harmonyos
埃菲尔铁塔_CV算法8 小时前
BOOST 在计算机视觉方面的应用及具体代码分析(二)
c++·人工智能·算法·机器学习·计算机视觉