零基础使用鸿蒙NDK开发最简步骤

懒得去读华为文档,又臭又长,估计读了后能用到5%就不错了。

1、File > New > Create Project > Application > Template Market > Native C++

这个Native C++ 工程不是说它是一个Native专用工程(即:不是说这个工程只能编译出动态库,然后放其它普通工程里用;一开始我是这么以为的),而是说它就是一个普通工程,只不过支持你在里边增删改c/cpp代码并在ets里调用。

1-1、创建后工程的 src/main/cpp/ 下已创建好相关文件:

types/libentry/

    index.d.ts // 接口函数(即需要在ets里调用的native 函数)的列表,根据需要增删改

    oh-package.json5 // 暂未发现需要修改

napi_init.cpp // 接口函数的实现;根据需要增删改

CMakeLists.txt // 暂未发现需要修改

1-2、在 src/main/ets/pages/index.ets 里已自动创建了相关代码,根据需要增删改

例如

import testNapi from 'libentry.so';

// 修改 testNapi 为自己希望的名称例如xxx,后边 testNapi.add也改为 xxx.add

...

let sum = testNapi.add(2, 3);

2、根据需要在 src/main/cpp/napi_init.cpp 增加代码

2-1、先去src/main/cpp/types/libentry/index.d.ts 里增加接口

例如模仿已自动形成好的 add接口,增加乘法接口 multiply

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

增加后该行会报错,点击该行就会让你自动生成实现代码(在napi_init.cpp 里)

然后转去napi_init.cpp里模仿已自动生成的add函数,去实现这个multiply函数

上边只是简单传递number,至于传递其它参数例如string怎么写,这时华为文档里就有比较适合的例子代码可以查到了。

3、如何使用原来自己已写好的c代码

将这些.h和.c复制到src/main/cpp/下,例如 test.h, test.c

在test.c里有个函数

char* test() { 
    //...
    // return ptr;
}

然后在napi_init.cpp前边加上

extern "C" {
    #include "test.c" // 最好是用 test.h 不过编译有问题,暂时先这样
}  

然后就可以在napi_init.cpp需要用到这个test函数的地方调用了。

整体逻辑就是:

ets里 let sum = testNapi.add(2, 3);

它去找 src/main/cpp/types/libentry/index.d.ts里的add接口

后者去找 src/main/cpp/napi_init.cpp 里对应的函数

static napi_value Add(napi_env env, napi_callback_info info) {
  // ...
}

接下来把一些我个人遇到的问题和解决汇总在此(本人原来在iOS XCode开发中自己用纯c写了一套代码,复制到Harmony DevEco中复用,出现了一些编译、运行错误)

1、二维数组的写法导致运行错误

在XCode里这么写是没问题的

size_t delta = sizeof(int) * w * h;
int** data = (int**)malloc(delta);// 此句在DevEco编译通过,但运行异常

似乎XCode的c编译器比较智能,它知道你的目的是分配一个二维数组的所有内存,运行没问题,运行后的在业务逻辑上检验也没问题。

但在DevEco中,它的编译器虽然对上述语句不报错,但会产生运行时错误,因为它认为上述写法只分配了一个int**的指针内存,并未分配你希望的二维数组内存,所以运行时一旦你去对这个二维数组的某个元素赋值,会抛出空指针错误。

对此改成比较老实的分配内存写法就可以了:

int** data = (int**)malloc(sizeof(int*) * h);// 二维数组的指针
for(int row = 0; row < h; row++) {
    data[row] = (int*)malloc(sizeof(int) * w);// 然后其内每个一维数组要显式地分配内存
}

当然释放内存的地方也要进行循环:

for (int row = 0; row < h; row++) {
    free(data[row]);
}
free(data);

2. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值