{"id":2771,"date":"2020-06-21T22:32:49","date_gmt":"2020-06-21T19:32:49","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2771"},"modified":"2024-12-16T22:32:27","modified_gmt":"2024-12-16T19:32:27","slug":"%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d0%b0%d0%bc%d0%b8-%d0%b2-android-c","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2020\/06\/21\/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d0%b0%d0%bc%d0%b8-%d0%b2-android-c\/","title":{"rendered":"Travailler avec des ressources dans Android C++"},"content":{"rendered":"<p>Pour travailler avec des ressources sous Android via ndk &#8211; En C++, il existe plusieurs options\u00a0:<\/p>\n<ol>\n<li>Utiliser l&#8217;acc\u00e8s aux ressources \u00e0 partir d&#8217;un fichier apk \u00e0 l&#8217;aide d&#8217;AssetManager<\/li>\n<li>T\u00e9l\u00e9chargez les ressources depuis Internet et d\u00e9compressez-les dans le r\u00e9pertoire de l&#8217;application, utilisez-les \u00e0 l&#8217;aide des m\u00e9thodes C++ standard<\/li>\n<li>M\u00e9thode combin\u00e9e &#8211; acc\u00e9dez \u00e0 l&#8217;archive avec les ressources dans l&#8217;apk via AssetManager, d\u00e9compressez-les dans le r\u00e9pertoire de l&#8217;application, puis utilisez-les \u00e0 l&#8217;aide des m\u00e9thodes C++ standard<\/li>\n<\/ol>\n<p>Ensuite, je d\u00e9crirai la m\u00e9thode d&#8217;acc\u00e8s combin\u00e9e utilis\u00e9e dans le moteur de jeu Flame Steel Engine.<br \/>Lorsque vous utilisez SDL, vous pouvez simplifier l&#8217;acc\u00e8s aux ressources \u00e0 partir d&#8217;un apk\u00a0; la biblioth\u00e8que encapsule les appels \u00e0 AssetManager, offrant des interfaces similaires \u00e0 stdio (fopen, fread, fclose, etc.)<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>SDL_RWops *io = SDL_RWFromFile(\"files.fschest\", \"r\");\n\n<\/code><\/pre>\n<\/div>\n<p>Apr\u00e8s avoir t\u00e9l\u00e9charg\u00e9 l&#8217;archive de l&#8217;apk vers le tampon, vous devez remplacer le r\u00e9pertoire de travail actuel par le r\u00e9pertoire de l&#8217;application, il est disponible pour l&#8217;application sans obtenir d&#8217;autorisations suppl\u00e9mentaires. Pour ce faire, nous utiliserons un wrapper SDL\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>chdir(SDL_AndroidGetInternalStoragePath());\n\n<\/code><\/pre>\n<\/div>\n<p>Ensuite, \u00e9crivez l&#8217;archive du tampon vers le r\u00e9pertoire de travail actuel en utilisant fopen, fwrite, fclose. Une fois l&#8217;archive dans un r\u00e9pertoire accessible en C++, d\u00e9compressez-la. Les archives Zip peuvent \u00eatre d\u00e9compress\u00e9es \u00e0 l&#8217;aide d&#8217;une combinaison de deux biblioth\u00e8ques\u00a0: minizip et zlib, le premier peut travailler avec la structure des archives, tandis que le second d\u00e9compresse les donn\u00e9es.<br \/>Pour gagner plus de contr\u00f4le et faciliter le portage, j&#8217;ai impl\u00e9ment\u00e9 mon propre format d&#8217;archive sans compression appel\u00e9 FSChest (Flame Steel Chest). Ce format prend en charge l&#8217;archivage d&#8217;un r\u00e9pertoire avec des fichiers et le d\u00e9ballage\u00a0; La hi\u00e9rarchie des dossiers n&#8217;est pas prise en charge\u00a0; vous pouvez uniquement travailler avec des fichiers.<br \/>On connecte l&#8217;en-t\u00eate de la biblioth\u00e8que FSChest, on d\u00e9compresse l&#8217;archive\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>#include \"fschest.h\" \nFSCHEST_extractChestToDirectory(archivePath, SDL_AndroidGetInternalStoragePath()); \n\n<\/code><\/pre>\n<\/div>\n<p>Apr\u00e8s le d\u00e9ballage, les interfaces C\/C++ auront acc\u00e8s aux fichiers de l&#8217;archive. Ainsi, je n&#8217;ai pas eu \u00e0 r\u00e9\u00e9crire tout le travail avec les fichiers dans le moteur, mais j&#8217;ai seulement ajout\u00e9 le d\u00e9ballage des fichiers au stade du lancement.<\/p>\n<h3>Sources<\/h3>\n<p><a href=\"https:\/\/developer.android.com\/ndk\/reference\/group\/asset\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/ r\u00e9f\u00e9rence\/groupe\/actif<\/a><\/p>\n<h3>Code source<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/space-jaguar-action-rpg\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/space- jaguar-action-rpg<\/a><br \/><a href=\"https:\/\/gitlab.com\/demensdeum\/fschest\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab.com\/demensdeum\/fschest<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour travailler avec des ressources sous Android via ndk &#8211; En C++, il existe plusieurs options\u00a0: Utiliser l&#8217;acc\u00e8s aux ressources \u00e0 partir d&#8217;un fichier apk \u00e0 l&#8217;aide d&#8217;AssetManager T\u00e9l\u00e9chargez les ressources depuis Internet et d\u00e9compressez-les dans le r\u00e9pertoire de l&#8217;application, utilisez-les \u00e0 l&#8217;aide des m\u00e9thodes C++ standard M\u00e9thode combin\u00e9e &#8211; acc\u00e9dez \u00e0 l&#8217;archive avec les<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2020\/06\/21\/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d0%b0%d0%bc%d0%b8-%d0%b2-android-c\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Travailler avec des ressources dans Android C++&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[],"class_list":["post-2771","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2771","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=2771"}],"version-history":[{"count":8,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2771\/revisions"}],"predecessor-version":[{"id":3910,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2771\/revisions\/3910"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=2771"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=2771"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=2771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}