Je peux également vérifier que fopen() fonctionne correctement, mais pas si vous essayez d'accéder à un fichier dans le dossier des ressources ou des actifs de l'application. Pour ne pas avoir à réinventer la roue, je vous recommande de placer tous les fichiers que vous souhaitez livrer avec votre application dans le dossier assets, où ils seront empaquetés pour être distribués.
Dans le cas du dossier assets, vous devez faire l'une des deux choses suivantes, selon que le fichier a été compressé ou non par l'empaqueteur. Les deux utilisent les méthodes AssetManager, et vous pouvez obtenir l'AssetManager à partir du contexte/app. Les noms de fichiers sont toujours relatifs au dossier assets, btw : si vous avez un fichier "foo.png" directement dans le dossier assets, vous ouvrirez "foo.png," pas quelque chose comme "assets/foo.png".
-
Si le fichier n'a pas été compressé (c'est-à-dire s'il s'agit d'une des extensions qui ne sont pas compressées, comme .png), vous pouvez obtenir un descripteur de fichier à partir de AssetManager.openFd() et le transmettre à C++. Vous pouvez ensuite utiliser fdopen(dup(fd), "r") ; pour ouvrir le fichier en tant que FILE*. Notez que vous doit fseek() à l'offset, et garder une trace de la longueur du fichier. En réalité, vous obtenez un gestionnaire de fichier pour l'ensemble des actifs, et le fichier qui vous intéresse n'en est qu'une petite partie.
-
Si votre fichier est compressé, vous devez utiliser le lecteur de flux Java : AssetManager.open() vous donne un InputStream que vous pouvez utiliser pour lire le fichier. Je lance une étape de prétraitement sur mon dossier d'actifs qui génère une liste de tous les fichiers avec leurs tailles respectives afin que je puisse savoir, par exemple, quelle taille de tampon allouer.
Si votre fichier est une ressource, il se peut que vous deviez passer par la classe Resource pour y accéder, bien qu'il semble que les ressources soient également regroupées dans le même paquet d'actifs. La classe Resource possède un appel openRawResource() pour obtenir l'InputStream et un appel openRawResourceFd() pour obtenir le descripteur de fichier, comme ci-dessus.
Bonne chance.
1 votes
Désolé, j'ai oublié de mettre à jour cette page. La racine du problème était l'impossibilité d'obtenir les permissions de lecture/écriture. Un problème similaire peut également être causé par le fait que la carte SD soit montée et que l'on essaie ensuite d'ouvrir un fichier sur cette carte.