Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

JAR (Архив Java) плагиныНабор кода, созданный вне Unity, который создает функциональные возможности в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь
в основном используются для взаимодействия с ОС Android или для вызова методов, написанных на Java, из ваших скриптов C#фрагмент кода, позволяющий создавать собственные Компоненты, запускайте игровые события, изменяйте свойства Компонентов с течением времени и реагируйте на ввод данных пользователем любым удобным для вас способом. Подробнее
См. в Словарь
.

Они могут содержать только код Java (например, они не могут содержать ресурсы Android), что сильно ограничивает их использование. Чтобы добавить подключаемый модуль JAR в свой проект, скопируйте файл .jar в любую из папок вашего проекта, затем выберите его в Unity, чтобы открыть настройки импорта в ИнспектореОкно Unity, в котором отображается информация о выбранном в данный момент игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в окне Словарь
. Установите флажок Android, чтобы пометить этот JAR-файл как совместимый с Android:

Параметры импорта подключаемого модуля JAR, отображаемые в окне инспектора
Параметры импорта подключаемого модуля JAR, отображаемые в окне инспектора

Использование подключаемых модулей Java

Unity использует собственный интерфейс Java (JNI) как при вызове кода из Java, так и при взаимодействии с Java или Java VM (виртуальная машина) из собственного кода или сценариев C #.

Исходные файлы Java в качестве подключаемых модулей

При использовании системы сборки Gradle можно не создавать файлы JAR. Для этого:

  1. Перетащите файл .java в свой проект Unity в качестве подключаемого модуля.
  2. В Инспекторе подключаемых модулей отметьте подключаемый модуль для платформы Android.
  3. При сборке для Android убедитесь, что Gradleсистема сборки Android автоматизирует несколько процессов сборки. Эта автоматизация означает, что вероятность возникновения многих распространенных ошибок сборки снижается. Подробнее
    См. в Словарь
    установлен как ваша Система сборки в настройках сборки.

Unity копирует файл Java в проект Gradle и выполняет сборку с его помощью.

Использование подключаемого модуля Java из собственного кода (C/C++)

Примечание. Информация в этом разделе требует глубоких знаний Android Java Native Interface (JNI).

Чтобы получить доступ к коду Java из подключаемых модулей C или C++, вам необходим доступ к виртуальной машине Java. Добавьте в свой код C/C++ следующий метод для доступа к виртуальной машине Java.

jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* jni_env = 0; vm->AttachCurrentThread(&jni_env, 0); return JNI_VERSION_1_6; }

Полное объяснение JNI выходит за рамки этого документа, но этот метод обычно включает поиск определения класса, разрешение метода конструктора () и создание нового экземпляра объекта, как показано в этом примере: jobject createJavaObject(JNIEnv* jni_env) { jclass cls_JavaClass = jni_env->FindClass("com/your/java/Class"); // find class definition jmethodID mid_JavaClass = jni_env->GetMethodID (cls_JavaClass, "", "()V"); // find constructor method jobject obj_JavaClass = jni_env->NewObject(cls_JavaClass, mid_JavaClass); // create object instance return jni_env->NewGlobalRef(obj_JavaClass); // return object with a global reference }

Дополнительную информацию о JNI см. в документации для разработчиков Android по JNI

Использование подключаемого модуля Java из сценариев C# со вспомогательными классами

Примечание. Информация в этом разделе требует глубоких знаний Android Java Native Interface (JNI).

AndroidJNIHelper и AndroidJNI Классы API Unity используются в качестве оболочки вокруг «сырого» интерфейса JNI.

Классы AndroidJavaObject и AndroidJavaClass API Unity автоматизируют множество задач при использовании вызовов JNI, а также используют кэширование для ускорения вызовов Java. Комбинация AndroidJavaObject и AndroidJavaClass построена на основе AndroidJNI и AndroidJNIHelper, но также обладает некоторыми дополнительными функциями. Эти классы также имеют статические методы, используемые для доступа к статическим членам классов Java.

Существует три способа выполнения вызовов Java JNI из сценариев C#:

  • необработанный JNI с помощью методов AndroidJNI ;
  • Класс
  • AndroidJNIHelper вместе с AndroidJNI;
  • AndroidJavaObject и AndroidJavaClass как наиболее удобные высокоуровневые API.

UnityEngine.AndroidJNI — это оболочка для вызовов JNI, доступных в C (как описано выше). Все методы в этом классе являются статическими и имеют сопоставление 1:1 с собственным интерфейсом Java.

UnityEngine.AndroidJNIHelper предоставляет вспомогательные функции, используемые на следующем уровне, которые представлены как общедоступные методы и могут быть полезны в особых случаях.

Экземпляры UnityEngine.AndroidJavaObject и UnityEngine.AndroidJavaClass имеют одно- одно сопоставление с экземпляром java.lang.Object и java.lang.Class (или их подклассов) на стороне Java соответственно. По сути, они обеспечивают 3 типа взаимодействия со стороной Java:

  • Вызов метода

  • Получить значение поля

  • Установить значение поля

Вызов разделен на две категории: вызов метода "void" и вызов метода с непустым возвращаемым типом. Универсальный тип используется для представления возвращаемого типа тех методов, которые возвращают тип, отличный от void. Get и Set всегда принимают универсальный тип, представляющий тип поля.

Примеры

Пример 1

AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string"); // jni.FindClass("java.lang.String"); // jni.GetMethodID(classID, "", "(Ljava/lang/String;)V"); // jni.NewStringUTF("some_string"); // jni.NewObject(classID, methodID, javaString); int hash = jo.Call("hashCode"); // jni.GetMethodID(classID, "hashCode", "()I"); // jni.CallIntMethod(objectID, methodID);

В этом примере создается экземпляр java.lang.String, инициализированный с помощью string и получает хеш-значение для этой строки.

Конструктор AndroidJavaObject принимает как минимум один параметр — имя класса, экземпляр которого создается. Любые параметры после имени класса предназначены для вызова конструктора объекта, в данном случае это строка «some_string». Последующий вызов hashCode() возвращает значение «int», которое используется в качестве параметра универсального типа для метода вызова в этом примере.

Примечание. Вложенный класс Java не может быть создан с использованием точечной нотации. Внутренние классы должны использовать разделитель $. Используйте android.view.ViewGroup$LayoutParams или android/view/ViewGroup$LayoutParams, где класс LayoutParams вложен в класс ViewGroup.

Пример 2

В этом примере показано, как получить каталог кеша для текущего приложения на C# без использования подключаемых модулей:

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); // jni.FindClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic ("currentActivity"); // jni.GetStaticFieldID(classID, "Ljava/lang/Object;"); // jni.GetStaticObjectField(classID, fieldID); // jni.FindClass("java.lang.Object"); Debug.Log(jo.Call ("getCacheDir").Call("getCanonicalPath")); // jni.GetMethodID(classID, "getCacheDir", "()Ljava/io/File;"); // or any baseclass thereof! // jni.CallObjectMethod(objectID, methodID); // jni.FindClass("java.io.File"); // jni.GetMethodID(classID, "getCanonicalPath", "()Ljava/lang/String;"); // jni.CallObjectMethod(objectID, methodID); // jni.GetStringUTFChars(javaString);

Этот пример начинается с AndroidJavaClass вместо AndroidJavaObject, чтобы получить доступ к статическому члену com.unity3d.player.UnityPlayer вместо создания нового объекта. Затем осуществляется доступ к статическому полю «currentActivity», но на этот раз в качестве общего параметра используется AndroidJavaObject. Это связано с тем, что фактический тип поля android.app.Activity является подклассом java.lang.Object, и любой непримитивный тип должен быть доступен как AndroidJavaObject. Исключением из этого правила являются строки, доступ к которым осуществляется напрямую, даже если они не представляют примитивный тип в Java.

getCacheDir() для объекта Activity, чтобы получить объект File, представляющий каталог кеша, getCanonicalPath() для получения строкового представления.

Unity предоставляет доступ к кешу приложения и каталогу файлов с помощью Application.temporaryCachePath и API Application.persistentDataPath.

Пример 3

В этом примере показано, как передавать данные из Java в Unity с помощью UnitySendMessage.

using UnityEngine; public class NewBehaviourScript : MonoBehaviour { void Start () { AndroidJNIHelper.debug = true; using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { jc.CallStatic("UnitySendMessage", "Main Camera", "JavaMessage", "NewMessage"); } } void JavaMessage(string message) { Debug.Log("message from java: " + message); } }

Класс Java com.unity3d.player.UnityPlayer имеет статический метод UnitySendMessage, эквивалентный iOSмобильной операционной системе Apple. Подробнее
См. в методе Словарь
: UnitySendMessage. Он используется в Java для передачи данных в Unity.

Несмотря на то, что UnitySendMessage вызывается из Unity, он передает сообщение с помощью Java, а затем Java обращается к собственному коду/коду Unity, чтобы доставить сообщение объекту с именем «Main КамераКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в Словарь
». К этому объекту прикреплен скрипт, который содержит метод с именем JavaMessage.

Рекомендации по использованию подключаемых модулей Java с Unity

Методы AndroidJavaObject и AndroidJavaClass требуют значительных вычислительных ресурсов (как и любые методы, использующие необработанный JNI). Сведите к минимуму количество переходов между управляемым и собственным/Java-кодом для повышения производительности и ясности кода.

//The first time you call a Java method like AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string"); // somewhat expensive int hash = jo.Call("hashCode"); // first time - expensive int hash = jo.Call("hashCode"); // second time - not as expensive as we already know the java method and can call it directly

Сборщик мусора Mono должен освобождать все созданные экземпляры AndroidJavaObject и AndroidJavaClass после использования, но рекомендуется их сохранить. в операторе using(){}, чтобы убедиться, что они удалены как можно скорее. Без этого вы не можете быть уверены, когда они будут уничтожены. Если вы установите для AndroidJNIHelper.debug значение true, вы увидите запись об активности сборщика мусора в выводе отладки.

//Getting the system language safely void Start () { using (AndroidJavaClass cls = new AndroidJavaClass("java.util.Locale")) { using(AndroidJavaObject locale = cls.CallStatic("getDefault")) { Debug.Log("current lang = " + locale.Call("getDisplayLanguage")); } } }
  • Обновленные функции в версии 5.5
  • В версии 2018.2 для проигрывателя Android добавлена поддержка подключаемых модулей исходных файлов Java
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3