Глава 8. Внешние файлы данных, Android assets

Идея та же что и в предыдущей главе – расположить файлы данных в пределах досягаемости от экзешника. Правда, в случае Андроида мы имеем дело не с экзешником, а с 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.


  1. VS верхнее меню -> Build -> Rebuild Solution. Результат: “2 succeeded, 0 failed, 0 skipped”.

Теперь, если открыть каталог C:\CPP\a999hello\p_android\p_android.Packaging\assetsWindows 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 если закрылся. Результат:

Что дальше? Шейдеры??

Нет, пока нет, пока еще нет…

Постойте, это еще не все!

Продолжение следует…


Leave a Reply

Your email address will not be published. Required fields are marked *