JAR (Архив Java) плагиныНабор кода, созданный вне Unity, который создает функциональные возможности в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь в основном используются для взаимодействия с ОС Android или для вызова методов, написанных на Java, из ваших скриптов C#фрагмент кода, позволяющий создавать собственные Компоненты, запускайте игровые события, изменяйте свойства Компонентов с течением времени и реагируйте на ввод данных пользователем любым удобным для вас способом. Подробнее
См. в Словарь.
Они могут содержать только код Java (например, они не могут содержать ресурсы Android), что сильно ограничивает их использование.
Чтобы добавить подключаемый модуль JAR в свой проект, скопируйте файл .jar в любую из папок вашего проекта, затем выберите его в Unity, чтобы открыть настройки импорта в ИнспектореОкно Unity, в котором отображается информация о выбранном в данный момент игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в окне Словарь. Установите флажок Android, чтобы пометить этот JAR-файл как совместимый с Android:
Использование подключаемых модулей Java
Unity использует собственный интерфейс Java (JNI) как при вызове кода из Java, так и при взаимодействии с Java или Java VM (виртуальная машина) из собственного кода или сценариев C #.
Исходные файлы Java в качестве подключаемых модулей
При использовании системы сборки Gradle можно не создавать файлы JAR. Для этого:
- Перетащите файл .java в свой проект Unity в качестве подключаемого модуля.
- В Инспекторе подключаемых модулей отметьте подключаемый модуль для платформы Android.
- При сборке для 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 выходит за рамки этого документа, но этот метод обычно включает поиск определения класса, разрешение метода конструктора ( Дополнительную информацию о JNI см. в документации для разработчиков Android по JNI р>
Примечание. Информация в этом разделе требует глубоких знаний Android Java Native Interface (JNI). Классы AndroidJavaObject и AndroidJavaClass API Unity автоматизируют множество задач при использовании вызовов JNI, а также используют кэширование для ускорения вызовов Java. Комбинация Существует три способа выполнения вызовов Java JNI из сценариев C#: 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 всегда принимают универсальный тип, представляющий тип поля. В этом примере создается экземпляр java.lang.String, инициализированный с помощью string и получает хеш-значение для этой строки. Конструктор Примечание. Вложенный класс Java не может быть создан с использованием точечной нотации. Внутренние классы должны использовать разделитель $. Используйте В этом примере показано, как получить каталог кеша для текущего приложения на C# без использования подключаемых модулей: Этот пример начинается с Unity предоставляет доступ к кешу приложения и каталогу файлов с помощью В этом примере показано, как передавать данные из Java в Unity с помощью Класс Java Несмотря на то, что Методы Сборщик мусора Mono должен освобождать все созданные экземпляры 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, "
Использование подключаемого модуля Java из сценариев C# со вспомогательными классами
AndroidJNIHelper
и AndroidJNI
Классы API Unity используются в качестве оболочки вокруг «сырого» интерфейса JNI.AndroidJavaObject
и AndroidJavaClass
построена на основе AndroidJNI
и AndroidJNIHelper
, но также обладает некоторыми дополнительными функциями. Эти классы также имеют статические методы, используемые для доступа к статическим членам классов Java.
AndroidJNI
;AndroidJNIHelper
вместе с AndroidJNI
;AndroidJavaObject
и AndroidJavaClass
как наиболее удобные высокоуровневые API.
Примеры
Пример 1
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string");
// jni.FindClass("java.lang.String");
// jni.GetMethodID(classID, "
AndroidJavaObject
принимает как минимум один параметр — имя класса, экземпляр которого создается. Любые параметры после имени класса предназначены для вызова конструктора объекта, в данном случае это строка «some_string». Последующий вызов hashCode() возвращает значение «int», которое используется в качестве параметра универсального типа для метода вызова в этом примере.android.view.ViewGroup$LayoutParams
или android/view/ViewGroup$LayoutParams
, где класс LayoutParams вложен в класс ViewGroup. Пример 2
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
// jni.FindClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic
AndroidJavaClass
вместо AndroidJavaObject
, чтобы получить доступ к статическому члену com.unity3d.player.UnityPlayer
вместо создания нового объекта. Затем осуществляется доступ к статическому полю «currentActivity», но на этот раз в качестве общего параметра используется AndroidJavaObject
. Это связано с тем, что фактический тип поля android.app.Activity является подклассом java.lang.Object
, и любой непримитивный тип должен быть доступен как AndroidJavaObject
. Исключением из этого правила являются строки, доступ к которым осуществляется напрямую, даже если они не представляют примитивный тип в Java.getCacheDir()
для объекта Activity, чтобы получить объект File, представляющий каталог кеша, getCanonicalPath()
для получения строкового представления.Application.temporaryCachePath
и API Application.persistentDataPath
.Пример 3
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);
}
}
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
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