• Lv0
    粉丝0

积分9 / 贡献0

提问1答案被采纳0文章1

【问题】关于OpenHarmony如何通过原生APP(HAP)+第三方so(Libusb)访问硬件设备的问题

lxwinter 显示全部楼层 发表于 2024-3-1 15:24:46
各位大佬:
   请教一个问题,当前情况如下:
一、操作步骤
1、自己成功编译迁移了libusb.so,到OpenHarmony下
2、基于libusb库,编写了一个纯C/C++的可执行文件,调用libusb访问一个外接的USB小模块。

注:使用的CMakelist编译Execuable。然后把可执行文件和libusb.so,通过hdc(类adb)送到OH系统上

3、编译完的两个库,发送后,赋予可执行文件777权限,然后执行,hdc指令参考:
hdc file send XxxTest /data/local/XxxTest
hdc file send libusb1.0.so /data/local/libusb.so
hdc shell "chmod 777 /data/local/*"

hdc shell
cd /data/local/
./XxxTest
4、通过以上操作,在OpenHarmony3.1/4.0上,可以正常通过C/C++编写的可执行文件,调用libusb.so,可以正常调用到外接的USB小模块,并正常驱动起来。

二、原生APP通过NAPI调用libusb访问硬件设备问题
   基于以上访问验证通了以后,我需要编写一个原生APP(OH的HAP)去调用这个libusb访问设备。

1、使用DevEco Studio,编写了一个DEMO,选择Native C++,然后就是基于NAPI的代码。
2、加载起libusb,配置好CMakelist。以及把前面编写的C/C++可执行程序代码,移到NAPI里,对外导出对应接口
3、在ArkTs层,通过NAPI导出的接口,调用到libusb去访问设备
   结果:访问不到,报错,libusb初始化就失败了,libusb找不到USB设备列表。
4、尝试各种方法:给与APP各种访问权限、ArkTs申请文件访问权限、ArkTS申请USB权限、把libusb放到/system/lib并给644/777权限等
都没用,通过NAPI记录的日志显示,调用libusb的init失败,other_error。实际就是libusb遍历usb设备节点都没找到

这样做的原因:需要跨平台Linux/Android,保持同一套代码。

1、请教各位大佬:以上问题,有哪位清楚,有什么方案解决?
2、官方第三方库迁移列表里,有libusb,说是迁移成功。如果迁移的libusb都没法通过HAP原生APP调用,无法访问到USB设备,那官方迁移libusb的意义是?

官方迁移第三方库的地址:[color=var(--hl_color) !important]https://gitee.com/openharmony-sig/tpc_c_cplusplus

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

精彩评论2

深开鸿_王石

沙发 发表于 2024-3-5 08:49:08
是不是selinux的问题呢?可以看看关了selinux,在hdc的shell里运行,setenforce 0,然后试试

lxwinter

发表于 2024-3-6 13:38  IP属地: 广东省广州市

回复 深开鸿_王石: 谢谢王总的回复,基于您说SELinux的我们也做过验证,说明如下:
1、默认没有使用hdc shell + setenforce 0的情况下,基于HAP+NAPI调用libusb库,会在libusb的libusb_init()方法,直接初始化失败,-99Other错误
2、在使用hdc shell + setenforce 0设置后,基于HAP+NAPI调用libusb库,libusb_init()返回成功。
   但是:libusb_get_device_list获取的USB设备列表为空,获取的数目为0。或者使用libusb_open_device_with_vid_pid直接打开指定vid/pid设备,也是失败。

  注:以上HAP+NAPI调用libusb库的代码,如果单独写一个CPP,编译成可执行文件,同样一套代码,是可以通过可执行文件,正常调用起libusb库,并且成功访问并控制USB设备的。

【1 条回复】

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部