栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Android NDK中native层读写文件图片、jni层读写电脑主机文件、图片——NDK I/O

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android NDK中native层读写文件图片、jni层读写电脑主机文件、图片——NDK I/O

在C++代码中,文件I/O是很方便的,只要找到电脑主机的路径,很容易进行读写。在NDK中,native位于java的下层,如果要在native代码中实现文件读写该怎么做呢?网上找到的资料都是讲具体的语法,但操作的逻辑是什么?文件路径怎么放?记录一下个人方法。

前提是在AndroidManifest.xml中先申请权限:


有的时候还需要动态申请权限,可自行搜索相关资料,如:

android读取文件的权限,安卓6.0动态权限打开读写文件权限_Lichel Xu的博客-CSDN博客

1、直观想法是把文件放在jni或者cpp目录下,直接读写,发现native根本找不到路径。

2、既然java位于native的上层,先把文件会给java,再传给native层是否可行呢?答案是可行的,方法是用AssetManager,把资源文件放在main/asset目录下,把路径通过java传给native,具体方法不再赘述,但有一个问题,这种方式只能读 ,不能写。

3、与大佬讨论后,发现所谓native读写文件根本不是一个问题,真正的问题是在native层的路径与电脑主机的路径对应关系是怎样的?

正确的方法是:在java层找到虚拟机或者真机的文件路径——将这个路径传给native读写——读写的文件在虚拟机与电脑主机之间互相拷贝。

3.1首先打开View——view windows——Device File Explorer,当虚拟机开机后,这其中就可以看到虚拟机的文件路径

 3.2然后在java层的MainActivity中,用代码查找Device File Explorer的路径与代码中的路径的关系,用到的方法有:

getExternalFilesDir();
Environment.getExternalStorageDirectory().getAbsolutePath();
getFilesDir().getAbsolutePath();

具体用法可以查找相关资料,关于安卓公有目录,私有目录,内部存储,外部存储的相关知识;

有时会遇到函数返回的路径在Device File Manager中找不到的情况,比如某些虚拟机上打不开 /storage/emulated/0这个目录,其实对应的就是sdcard目录,而有的虚拟机这个目录可以直接看到。

 3.3经过了3.2我们就知道了文件的存放路径了,把这个路径传给native,比如定义如下函数loadFile,用String 把路径告诉native,再在native随便读写就OK了。这里如果用String可能会有NDk断点失效问题,可参考上一篇:Android Studio art_sigsegv_fault —— art::FaultManager::HandleFault——NDK断点失效_weixin_46249203的博客-CSDN博客

 当然,这里要注意,native读写不支持文件流的方式,比如 ifstream,ofstream的方式这里不支持,因为这是C++的方法 ,在native用的是C语言,对文本读写用的是以下函数:

fgets();
fscanf(fp, "%lf", &d);         
fputs();
fputc();
fprintf();

这些函数,具体参考如下:

https://blog.csdn.net/lyj2014211626/article/details/71844122

而图片的读写可以直接用opencv,当然是要配置好opencv;总之,现在无缝实现了native层对虚拟机或者真机文件 的读写,下一步虚拟机存储空间与电脑主机的交互怎样呢?简单,直接在Device File Explorer中upload 或者 save as:

 问题解决了。

总结,要解决问题,首先要定义到底什么是问题.......但愿少踩这种坑.....

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/885586.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号