{"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\/pt\/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":"Trabalhando com recursos em Android C++"},"content":{"rendered":"<p>Para trabalhar com recursos no Android via ndk &#8211; C++ existem v\u00e1rias op\u00e7\u00f5es:<\/p>\n<ol>\n<li>Use o acesso aos recursos de um arquivo apk usando o AssetManager<\/li>\n<li>Baixe recursos da Internet e descompacte-os no diret\u00f3rio do aplicativo, use-os usando m\u00e9todos C++ padr\u00e3o<\/li>\n<li>M\u00e9todo combinado &#8211; acesse o arquivo com recursos no apk via AssetManager, descompacte-os no diret\u00f3rio do aplicativo e use-os usando m\u00e9todos C++ padr\u00e3o<\/li>\n<\/ol>\n<p>A seguir descreverei o m\u00e9todo de acesso combinado usado no motor de jogo Flame Steel Engine.<br \/>Ao usar SDL, voc\u00ea pode simplificar o acesso aos recursos de um apk; a biblioteca agrupa chamadas para o AssetManager, oferecendo interfaces semelhantes ao 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>Depois de baixar o arquivo do apk para o buffer, voc\u00ea precisa alterar o diret\u00f3rio de trabalho atual para o diret\u00f3rio do aplicativo, ele fica dispon\u00edvel para o aplicativo sem obter permiss\u00f5es adicionais. Para fazer isso, usaremos um wrapper SDL:<\/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>Em seguida, grave o arquivo do buffer no diret\u00f3rio de trabalho atual usando fopen, fwrite, fclose. Assim que o arquivo estiver em um diret\u00f3rio acess\u00edvel ao C++, descompacte-o. Os arquivos Zip podem ser descompactados usando uma combina\u00e7\u00e3o de duas bibliotecas &#8211; &#8211; minizip e zlib, o primeiro pode trabalhar com a estrutura de arquivos, enquanto o segundo descompacta dados.<br \/>Para obter mais controle e facilidade de portabilidade, implementei meu pr\u00f3prio formato de arquivo de compacta\u00e7\u00e3o zero chamado FSChest (Flame Steel Chest). Este formato suporta arquivar um diret\u00f3rio com arquivos e descompact\u00e1-lo; N\u00e3o h\u00e1 suporte para hierarquia de pastas; voc\u00ea s\u00f3 pode trabalhar com arquivos.<br \/>Conectamos o cabe\u00e7alho da biblioteca FSChest, descompacte o arquivo:<\/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>Ap\u00f3s a descompacta\u00e7\u00e3o, as interfaces C\/C++ ter\u00e3o acesso aos arquivos do arquivo. Assim, n\u00e3o precisei reescrever todo o trabalho com arquivos no mecanismo, apenas adicionei a descompacta\u00e7\u00e3o dos arquivos na fase de inicializa\u00e7\u00e3o.<\/p>\n<h3>Fontes<\/h3>\n<p><a href=\"https:\/\/developer.android.com\/ndk\/reference\/group\/asset\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/ refer\u00eancia\/grupo\/ativo<\/a><\/p>\n<h3>C\u00f3digo Fonte<\/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>Para trabalhar com recursos no Android via ndk &#8211; C++ existem v\u00e1rias op\u00e7\u00f5es: Use o acesso aos recursos de um arquivo apk usando o AssetManager Baixe recursos da Internet e descompacte-os no diret\u00f3rio do aplicativo, use-os usando m\u00e9todos C++ padr\u00e3o M\u00e9todo combinado &#8211; acesse o arquivo com recursos no apk via AssetManager, descompacte-os no diret\u00f3rio<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/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;Trabalhando com recursos em 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":"pt","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\/pt\/wp-json\/wp\/v2\/posts\/2771","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2771"}],"version-history":[{"count":8,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2771\/revisions"}],"predecessor-version":[{"id":3910,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2771\/revisions\/3910"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2771"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2771"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}