Qt Android 无法加载 assets 目录下 lua 校准脚本

2024-04-22 14:52

本文主要是介绍Qt Android 无法加载 assets 目录下 lua 校准脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

C 语言使用 fopen 无法打开 assets 目录下的文件。

项目的校准脚本在打包的时候都放在 assets 资源目录下,但是 assets 是压缩包,Android 下虚拟目录,所以 Qt 可以加载 assets 目录下文件,但是 C 语言的 fropen 函数却无法打开。

解决方案

为此只能将所有的脚本文件移动到内部存储器中保存,然后从内存存储器中加载校准脚本可以使用。

为了实现这个目的,需要修改原有的逻辑,程序在运行时将判断该存储器中是否存在校准脚本,如果不存在则从 assets 资源目录下复制过来。

  1. 复制目录函数。
#ifdef __ANDROID__
//(源文件目录路劲,目的文件目录,文件存在是否覆盖)
bool copyDirectory(const QString& srcPath, const QString& dstPath, bool coverFileIfExist = true)
{QDir srcDir(srcPath);QDir dstDir(dstPath);qInfo() << srcPath << dstPath;if (!dstDir.exists()) { //目的文件目录不存在则创建文件目录if (!dstDir.mkdir(dstDir.absolutePath())) {qInfo() << "create " << dstDir << " failed";return false;}}QFileInfoList fileInfoList = srcDir.entryInfoList();foreach(QFileInfo fileInfo, fileInfoList) {if (fileInfo.fileName() == "." || fileInfo.fileName() == "..")continue;if (fileInfo.isDir()) {    // 当为目录时,递归的进行copyif (!copyDirectory(fileInfo.filePath(), dstDir.filePath(fileInfo.fileName()), coverFileIfExist))return false;}else {            //当允许覆盖操作时,将旧文件进行删除操作if (coverFileIfExist && dstDir.exists(fileInfo.fileName())) {dstDir.remove(fileInfo.fileName());}/// 进行文件copyqInfo() << "copy " << fileInfo.filePath() << " to " << dstDir.filePath(fileInfo.fileName());if (!QFile::copy(fileInfo.filePath(), dstDir.filePath(fileInfo.fileName()))) {qInfo() << "copy failed." << fileInfo.fileName() << dstDir.filePath(fileInfo.fileName()) << fileInfo.filePath();return false;}}}return true;
}
#endif
  1. main 函数中复制校准脚本,只判断其中一个脚本。
int main(int argc, char *argv[])
{
#ifdef __ANDROID__// 如果校准脚本不存在,复制校准脚本QString scriptPath = "/storage/emulated/0/UPCNC3/script";if(!QFile::exists(scriptPath + "/Calculate.lua"))copyDirectory("assets:/script/", scriptPath);
#endif//...
}
  1. 设置校准时从 /storage/emulated/0/UPCNC3/script 目录下加载脚本脚本。
#ifdef __ANDROID__obj["rootdir"] = "/storage/emulated/0/UPCNC3";
#elseobj["rootdir"] = m_sDir;
#endif

这篇关于Qt Android 无法加载 assets 目录下 lua 校准脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926087

相关文章

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

Qt实现删除布局与布局切换功能

《Qt实现删除布局与布局切换功能》在Qt应用开发中,动态管理布局是一个常见需求,比如根据用户操作动态删除某个布局,或在不同布局间进行切换,本文将详细介绍如何实现这些功能,并通过完整示例展示具体操作,需... 目录一、Qt动态删除布局1. 布局删除的注意事项2. 动态删除布局的实现步骤示例:删除vboxLay

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码