Доступ к ресурсам StreamingAssets из C DLL в Unity на Android

#c# #android #c #unity3d

#c# #Android #c #unity3d

Вопрос:

Я разработал приложение C # в Unity для Android. Кроме того, я создал пользовательскую внешнюю C DLL, которая правильно загружается и доступна из кода C #. Я также добавил несколько XML-файлов в папку StreamingAssets, которая работает должным образом, поскольку я вижу, что эти файлы загружены в .apk.

В настоящее время моя проблема заключается в том, что я не могу получить доступ к таким XML-файлам из моей библиотеки C . С одной стороны, я не уверен, как это сделать правильно, с другой стороны, я пробовал несколько неудачных подходов, в том числе пытался понять, в каком cwd была загружена моя DLL, а затем перейти к нужным мне файлам (что не сработало, поскольку я постоянно получаю сообщение об ошибке «отказано в доступе»).

Редактировать:

Ваши ответы на самом деле поставили меня на правильный путь, и я решил проблему следующим образом:

  • На этапе OnStart() моего приложения я использую класс UnityWebRequest для извлечения из файла JAR необходимых файлов, а затем сохраняю их в приложении.persistentDataPath
  • После этого я передаю в свою DLL новый путь к каждому файлу, который позволяет мне получать к ним доступ без каких-либо проблем.

Комментарии:

1. Во встроенном приложении я бы скопировал их в Application.persistentDataPath , который обычно доступен для целевой обычной системы папок. Как сказано там, путь на Android есть /storage/emulated/0/Android/data/<packagename>/files , и к нему также можно получить доступ с помощью android.content.Context.getExternalFilesDir

Ответ №1:

На Android StreamingAssets находятся в jar. Это вполне может быть причиной, по которой вы не можете получить к ним доступ, но, как вы можете видеть в руководстве, вы можете использовать WWW класс для извлечения файлов там.

На Android файлы содержатся в сжатом файле .jar (который, по сути, имеет тот же формат, что и стандартные файлы, сжатые в zip-формате). Это означает, что если вы не используете класс WWW Unity для извлечения файла, вам необходимо использовать дополнительное программное обеспечение, чтобы заглянуть в архив .jar и получить файл.

(https://docs.unity3d.com/Manual/StreamingAssets.html )

Комментарии:

1. Спасибо, я знал об этой части документации. Проблема в том, что класс UnityWWW может быть вызван только со стороны C # кода. Мне нужно загрузить XML-файлы непосредственно из моей C DLL.

Ответ №2:

На Android файлы содержатся в сжатом файле .jar (который, по сути, имеет тот же формат, что и стандартные файлы, сжатые в zip-формате). Это означает, что если вы не используете класс WWW Unity для извлечения файла, вам необходимо использовать дополнительное программное обеспечение, чтобы заглянуть в архив .jar и получить файл.


JAR — это формат файла пакета, обычно используемый для объединения многих файлов классов Java и связанных с ними метаданных и ресурсов в один файл для распространения. Файлы JAR — это архивные файлы, которые включают файл манифеста, специфичный для Java. Они построены в формате ZIP и обычно имеют расширение файла .jar.


Это означает, что вы можете работать с файлами jar так же, как и с zip-файлами. Для minizip есть форк с примерами его использования.