React Native开发鸿蒙Next---react-native-cameraroll在ArkTS下的接入报错

264 阅读1分钟

React Native开发鸿蒙Next---react-native-cameraroll在ArkTS下的接入报错

继续堆社区RN的鸿蒙化。其中有个浏览帖子图片并下载保存到手机相册的功能,在当初开发的时候是先借助react-native-fs把网络图片下载到临时文件夹后,再利用rn自带的CameraRoll另存到相册。在RN新架构中CameraRoll已经从react-native迁移到了社区中。所以就打算直接用react-native-camera-roll直接下载网络图片到相册的方式来实现。camera-roll有鸿蒙化版本@react-native-oh-tpl/camera-roll。按照管理接入。但在ArkTS编译的时候会报错。

ld.lld: error: undefined symbol: rnoh::RNCCameraRollPermission::RNCCameraRollPermission(rnoh::ArkTSTurboModule::Context, std::__n1::basic_string<char, std::__n1::char_traits<char>, std::__n1::allocator<char>>)

codengen生成的src/main/cpp/generated

图片问题出在createTurboModule方法图片

看了下camera-roll的源码,发现是在CameraRollTurboModulesFactory中会去动态实例化CameraRollTurboModule与CameraRollPermissionTurboModule导致的。codegen在生成的时候会去匹配TurboModule导致去创建了RNCCameraRoll与RNCCameraRollPermission的turbomodule的cpp并去初始化。这种"二合一"的创建方式导致了codegen生成代码无法准确识别。

image.png

处理方式很干脆------删掉createTurboModule中RNCCameraRollPermission的创建即可。

image.png

做个测试页面运行一下获取权限,把图片存储到相册都没有问题


  <Button  title="savePhotos"  
  onPress={() => {  CameraRoll.saveAsset("https://res.vmallres.com/uomcdn/CN/cms/202408/5442d69d916d4bcf9ee740d595a164fb.jpg")
  .then((res) => {    console.log('res-----',res);  });}}>
  </Button>

image.png

image.png

image.png

后续遇到这种在Factory中创建多个turbomodeule的依赖需要留意codegen创建的代码,可能需要手动调整(能通过命令调整吗?如有知道的不吝赐教)。


更多内容可关注

我的公众号悬空八只脚