Идея та же что и в предыдущей главе – расположить файлы данных в пределах досягаемости от экзешника. Правда, в случае Андроида мы имеем дело не с экзешником, а с APK. Кроме того, нам надо доставить файлы не просто в другой каталог, а на другое устройство. Единственный (известный мне) “транспорт” – это специальный каталог “assets“, который встраивается в APK, и затем инсталлируется на конечное устройство. Значит, давайте создадим его.
1. Запускаем Visual Studio, открываем C:\CPP\a999hello\p_android\p_android.sln solution.
Right-click на p_android.Packaging проект(НЕ на p_android.NativeActivity как раньше, а на p_android.Packaging ). Add -> New Folder, назовем его assets. Это специальное зарезервированное имя, p_android.Packaging в курсе что с ним делать.
2. Теперь открываем p_android.NativeActivity project Properties, All Configurations / ARM64, идем в Configuration Properties -> Build Events -> Post-Build Event -> Command Line -> Edit, добавляем команду
xcopy "..\..\..\engine\dt\*.*" "..\$(RootNamespace).Packaging\assets\dt\" /E /R /D /y
Ok, Apply, Ok
Раскадровка:
“..\..\..\engine\dt\*.*” – откуда копировать. В отличие от Windows, здесь нам надо подняться на 1 уровень выше.
“..\$(RootNamespace).Packaging\assets\dt\” – куда копировать. Поскольку эта команда будет исполняться из каталога p_android.NativeActivity, нам надо подняться на 1 уровень вверх и продолжить в каталог p_android.Packaging и затем – в assets.
Остальное – то же что и в Windows.
- VS верхнее меню -> Build -> Rebuild Solution. Результат: “2 succeeded, 0 failed, 0 skipped”.
Теперь, если открыть каталог C:\CPP\a999hello\p_android\p_android.Packaging\assets (в Windows File Explorer-е, не в VS), то увидим там наш “dt”. Также он должен быть теперь включен в APK. Но, к моему большому удивлению, оказалось, что нет. Никаких следов test0.txt файла в APK (который находится в C:\CPP\a999hello\p_android\p_android.Packaging\ARM64\Debug) не обнаружено.
4. Оказалось, что надо было вносить каталоги и файлы в assets по-штучно вручную, как мы обычно делали с программными файлами (right-click, add item, и т.д.). Это БОЛЬШАЯ проблема. Понятно, что их (файлов) будет миллион: шейдеры, модели, текстуры, и т.д. Отслеживать их будет просто нереально. Надо как-то заставить assets включать его содержимое автоматом.
Решение далось непросто, пришлось погрузиться ОЧЕНЬ глубоко, но зато теперь я знаю
Как добавить файлы в Android assets в Visual Studio
В Android Studio (в отличие от Visual Studio), все что находится в каталоге assets, автоматически включается в APK. Чтобы воспроизвести это в VS, надо подправить конфиг файл проекта p_android.Packaging:
Закрываем Visual Studio.
В Текстовом Редакторе открываем C:\CPP\a999hello\p_android\p_android.Packaging\p_android.Packaging.androidproj
Прокручиваем вниз. Ближе к концу есть секция:
<ItemGroup>
<Content Include="res\values\strings.xml" />
<AntBuildXml Include="build.xml" />
<AndroidManifest Include="AndroidManifest.xml" />
<AntProjectPropertiesFile Include="project.properties" />
</ItemGroup>
Вверху добавляем:
<Content Include="assets\**" />
чтобы получилось:
<ItemGroup>
<Content Include="assets\**" />
<Content Include="res\values\strings.xml" />
<AntBuildXml Include="build.xml" />
<AndroidManifest Include="AndroidManifest.xml" />
<AntProjectPropertiesFile Include="project.properties" />
</ItemGroup>
Save.
5. Запускаем Visual Studio, открываем C:\CPP\a999hello\p_android\p_android.sln solution.
Top menu -> Build -> Rebuild solution. Результат: “2 succeeded, 0 failed, 0 skipped”.
Вот теперь, если открыть C:\CPP\a999hello\p_android\p_android.Packaging\ARM64\Debug\p_android.apk в текстовом редакторе, можно убедиться, что test0.txt – там.
6. Так что, теперь можно прочитать этот файл на Андроиде?? Абсолютно. Код:
//reading test file
char buff[256];
AAssetManager* am = androidApp->activity->assetManager;
AAsset* asset = AAssetManager_open(am, "dt/shaders/test0.txt", AASSET_MODE_UNKNOWN);
if (asset != NULL) {
long size = AAsset_getLength(asset);
AAsset_read(asset, buff, size);
mylog("File size = %d, text:\n%s\n", size, buff);
AAsset_close(asset);
}
else {
mylog("Asset not found.\n");
}
Откроем main.cpp. Прокрутим вниз. Вставим этот код перед theGame.run().
Включаем, разблокируем и подключаем Андроид, разрешаем дебаггинг.
- Сперва запускаем Logcat (VS top menu -> Tools -> Android Tools -> Logcat), в поисковой строке набираем “mylog“, Enter. Если надо – очищаем экран (иконка с красным крестиком в меню Logcat-а).
Теперь – компиляция и запуск (зеленая стрелка). Пере-запускаем Logcat если закрылся. Результат:
Что дальше? Шейдеры??
Нет, пока нет, пока еще нет…
Постойте, это еще не все!
Продолжение следует…