Learn about the best practices for calling Java and Kotlin plug-inA set of code created outside of Unity that creates functionality in Unity. There are two kinds of plug-ins you can use in Unity: Managed plug-ins (managed .NET assemblies created with tools like Visual Studio) and Native plug-ins (platform-specific native code libraries). More info
See in Glossary code from C# scriptsA piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like. More info
See in Glossary to improve performance of your application.
Using the Java Native Interface (JNI), through either the high-level or low-level C# API is resource intensive and can be slow. To improve performance, and also code clarity, it’s best practice to keep the number of JNI calls low.
To avoid unnecessary JNI calls, the high-level C# API caches the ID of each Java method that you call. This means that subsequent calls to the same method aren’t as resource intensive as the first call. The calls don’t need to be during the same frame or even from the same AndroidJavaObject
/AndroidJavaClass
instance. If you use the low-level API and want this performance benefit, you must manually cache method ID. Otherwise, it’s best practice to use the high-level API.
Note: Unity maintains the cache until the application closes. This includes while the application is in the background.
It’s best practice to wrap any instance of AndroidJavaObject
or AndroidJavaClass
with a using
statement to ensure Unity destroys them as soon as possible. If you don’t use using
, Unity’s garbage collector will still release all created instances, but you lose control over when this happens.
The following code example demonstrates how to use using
statements to access the system language in an optimal way:
using UnityEngine;
public class LocaleExample : MonoBehaviour
{
void Start()
{
using (AndroidJavaClass cls = new AndroidJavaClass("java.util.Locale"))
using (AndroidJavaObject locale = cls.CallStatic<AndroidJavaObject>("getDefault"))
{
if (locale != null)
{
Debug.Log("current lang = " + locale.Call<string>("getDisplayLanguage"));
}
}
}
}
Note: To access a record of the garbage collector’s activity in Android Logcat, set AndroidJNIHelper.debug to true
.