Native Java интерфейс APIs и Unity
Unity предоставляет низкоуровневый и высокоуровневый Java Native Interface (JNI) APIs, который позволяет взаимодействовать с Java кодом из C# скриптов.
Низкий уровень API
Низкий уровень AndroidJNI класс оборачивает вызовы JNI и предоставляет статические методы, напрямую соответствующие методам JNI. AndroidJNIHelper API предоставляет функциональность помощника, которая в основном используется высокоуровневым API, но они могут быть полезны в определенных ситуациях.
Высокий уровень API
Высокий уровень AndroidJavaObject, AndroidJavaClass, и AndroidJavaProxy классы автоматизируют множество задач, требуемых для вызова JNI. Они также используют кэширование для ускорения вызовов в Java. Сочетание классов AndroidJavaObject и AndroidJavaClass построен на вершине AndroidJNI и AndroidJNIHelper, но, кроме того, содержат дополнительную функциональность — например, статические методы для доступа к статическим членам классов Java.
Кроме того, Unity предоставляет AndroidApplication класс, чтобы упростить доступ к экземплярам currentActivity, currentContext, и currentConfiguration для вашего приложения. Этот класс позволяет также поручить выполнение кода потоку интерфейса или главному потоку в зависимости от нужд приложения.
Экземпляры AndroidJavaObject и AndroidJavaClass имеют отображение один к одному к экземплярам java.lang.Object и java.lang.Class соответственно. Они обеспечивают три типа взаимодействия с кодом Java/Kotlin:
У каждого взаимодействия есть и статическая версия:
- CallStatic чтобы вызвать статический метод.
- GetStatic чтобы получить значение статического поля.
- SetStatic чтобы задать значение статического поля.
Когда вы получаете значение поля или вызываете метод, который возвращает значение, вы используете generics для указания типа возвращения. Когда вы устанавливаете значение поля, вы также используете generics для указания типа поля, которое вы устанавливаете. Для методов, которые не возвращают значение, существует обычная, необщая версия Call.
Важно: Вы должны получить доступ к любому непримитивному типу как к AndroidJavaObject. Единственным исключением является строка, к которой вы получаете прямой доступ, даже если она не представляет примитивный тип в Java.