我一直在尝试在我的Java代码中将一些assets
复制到external storage
,并将目录传递给我的原生C/C++
代码进行读取。但问题是,如果设备上有no SD card
,则getExternalFilesDir()
会返回“storage / emulated / 0 / Android / data / com.example.app / files”,当我传递给native code
以进行fopen和fread时,会导致应用程序崩溃。我相信原因是因为目录是人为的或符号链接或类似的东西。但是,即使我在传递给本机代码的路径上使用stdlib.h function realpath()
,它仍然会崩溃。但是,如果我在路径中手动替换emulated/0/
emulated/legacy/
,realpath()
突然工作并将其转换为文件存储的实际位置,fread()
可以正常使用没有崩溃。不知何故emulated/legacy/
是实际的符号链接而emulated/0/
是其他的东西?
问题是我想编写长期可靠的代码,无论Android组织外部存储和这些符号链接/虚拟文件系统的方式有何变化。我也希望代码能够运行,无论它运行在哪个设备上(我相信这些模拟目录因设备而异)。
有没有办法让Java中的external storage directory
可以写入并可靠地从本机代码中读取,而不执行此操作 替换为遗留 黑客?
感谢您提供任何帮助。
修改:在getPath()
返回的getCanonicalPath()
上呼叫getAbsolutePath()
,File
和getExternalFilesDir()
都会返回相同的路径。