JAR (Java Archive) plug-insSatu set kode yang dibuat di luar Unity yang menciptakan fungsi dalam Unity. Ada dua jenis plug-ins yang dapat Anda gunakan di Unity: Managed plug-ins (diproduksi. Rakitan NET dibuat dengan alat-alat seperti Studio Visual) dan plug-ins asli (pustaka kode asli yang spesifik platform). More info
Lihat di Glossary terutama digunakan untuk mengaktifkan interaksi dengan OS Android atau untuk memanggil metode yang ditulis di Java dari dalam C # scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary Anda.
Mereka hanya dapat berisi kode Java (misalnya, mereka tidak dapat mengandung sumber daya Android), yang membuat penggunaannya sangat terbatas. Untuk menambahkan plug-in JAR ke proyek Anda, salin file .jar ke folder proyek Anda, lalu pilih di Unity untuk membuka Pengaturan Impor di jendela InspectorJendela Unity yang menampilkan informasi tentang Pengaturan GameObject yang dipilih saat ini, aset atau proyek, memungkinkan Anda untuk memeriksa dan mengedit nilai. More info
Lihat di Glossary. Tick kotak centang Android untuk menandai file .jar ini sesuai dengan Android:
Unity menggunakan Antarmuka asli Java (JNI) baik ketika memanggil kode dari Java dan ketika berinteraksi dengan Java atau Java VM (Mesin Virtual) dari kode asli atau skrip C#.
Saat menggunakan sistem build Gradle, Anda dapat menghindari membuat file JAR. Untuk melakukan ini:
Unity menyalin file java ke proyek Gradle dan membangun dengan itu.
Catatan: Informasi ini di bagian ini membutuhkan pengetahuan lanjutan dari Android Java Native Interface (JNI).
Untuk mengakses kode Java dari C atau C++ plug-ins, Anda perlu akses ke Java VM. Tambahkan metode berikut ke kode C / C++ Anda untuk mengakses Java VM.
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* jni_env = 0;
vm->AttachCurrentThread(&jni_env, 0);
return JNI_VERSION_1_6;
}
Di luar ruang lingkup dokumen ini untuk menjelaskan JNI sepenuhnya, tetapi metode ini biasanya melibatkan menemukan definisi kelas, menyelesaikan metode konstror (<init>) dan membuat instance objek baru, seperti yang ditunjukkan dalam contoh ini:
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, "<init>", "()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
}
Untuk informasi lebih lanjut tentang JNI, lihat Android Developer API
Catatan: Informasi ini di bagian ini membutuhkan pengetahuan lanjutan dari Android Java Native Interface (JNI).
Kelas API Unity AndroidJNIHelper
dan AndroidJNI
digunakan sebagai pembungkus di sekitar antarmuka JNI.
The AndroidJavaObject and AndroidJavaClass Unity API kelas automate banyak tugas ketika menggunakan panggilan JNI, dan mereka juga menggunakan caching untuk membuat panggilan ke Java lebih cepat. Kombinasi AndroidJavaObject
dan AndroidJavaClass
dibangun di atas AndroidJNI
dan AndroidJNIHelper
, tetapi juga memiliki beberapa fungsi tambahan. Kelas-kelas ini juga memiliki metode statis yang digunakan untuk mengakses anggota statis kelas Java.
Ada tiga cara untuk membuat panggilan Java JNI dari skrip C# Anda:
AndroidJNI
;AndroidJNIHelper
kelas bersama dengan AndroidJNI
;AndroidJavaObject
dan kelas AndroidJavaClass
sebagai API tingkat tinggi yang paling nyaman.WordPress.org adalah pembungkus untuk panggilan JNI tersedia di C (seperti yang dijelaskan di atas). Semua metode di kelas ini statis dan memiliki 1: 1 pemetaan ke Java Native Interface.
WordPress.org menyediakan fungsi pembantu yang digunakan oleh tingkat berikutnya, yang terkena metode publik dan mungkin berguna dalam kasus khusus.
Instances dari WordPress.org dan WordPress.org memiliki satu-untuk-satu pemetaan untuk contoh java.lang. WordPress.org Kelas (atau subklasitas mereka) di sisi Jawa, masing-masing. Mereka pada dasarnya menyediakan 3 jenis interaksi dengan sisi Jawa:
Hubungi metode
Dapatkan nilai lapangan
Mengatur nilai lapangan
Panggilan dipisahkan menjadi dua kategori: Sebuah panggilan ke metode 'hindari', dan panggilan ke metode dengan jenis pengembalian non-hindari. Jenis generik digunakan untuk mewakili jenis kembali metode-metode yang mengembalikan tipe non-void. Mendapatkan dan Set selalu mengambil jenis generik mewakili jenis lapangan.
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string");
// jni.FindClass("java.lang.String");
// jni.GetMethodID(classID, "<init>", "(Ljava/lang/String;)V");
// jni.NewStringUTF("some_string");
// jni.NewObject(classID, methodID, javaString);
int hash = jo.Call<int>("hashCode");
// jni.GetMethodID(classID, "hashCode", "()I");
// jni.CallIntMethod(objectID, methodID);
Contoh ini menciptakan contoh Login Login diinisialisasikan dengan string, dan mengambil nilai hash untuk string itu.
Konstruktor AndroidJavaObject
membutuhkan setidaknya satu parameter - nama kelas untuk membangun contoh. Setiap parameter setelah nama kelas adalah untuk panggilan konstror pada objek, dalam hal ini string “some_string”. Panggilan berikutnya untuk hashCode() kembali 'int' yang digunakan sebagai parameter tipe generik ke metode panggilan dalam contoh ini.
Note: Kelas Jawa yang bersarang tidak dapat disaat menggunakan notasi yang tertidur. Kelas dalam harus menggunakan pemisah $. Gunakan android.view.ViewGroup$LayoutParams
atau android/view/ViewGroup$LayoutParams
, di mana kelas LayoutParams bersarang dalam kelas ViewGroup.
Contoh ini menunjukkan bagaimana untuk mendapatkan direktori cache untuk aplikasi saat ini di C # tanpa menggunakan plug-ins:
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
// jni.FindClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic <AndroidJavaObject>("currentActivity");
// jni.GetStaticFieldID(classID, "Ljava/lang/Object;");
// jni.GetStaticObjectField(classID, fieldID);
// jni.FindClass("java.lang.Object");
Debug.Log(jo.Call <AndroidJavaObject>("getCacheDir").Call<string>("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);
Contoh ini dimulai dengan AndroidJavaClass
bukan AndroidJavaObject
untuk mengakses anggota statis com.unity3d.player.UnityPlayer
daripada menciptakan objek baru. Kemudian kolom statis “currentActivity” diakses tetapi kali ini AndroidJavaObject
digunakan sebagai parameter generik. Ini karena tipe lapangan yang sebenarnya WordPress.org adalah subkelas java.lang.Object
, dan setiap tipe non-primitive harus diakses sebagai AndroidJavaObject
. Pengecualian untuk aturan ini adalah string, yang diakses secara langsung meskipun mereka tidak mewakili jenis primitif di Jawa.
getCacheDir()
kemudian dapat disebut pada objek Aktivitas untuk mendapatkan objek File mewakili direktori cache, getCanonicalPath()
kemudian dapat disebut untuk mendapatkan representasi string.
Unity menyediakan akses ke direktori cache dan file aplikasi dengan dan API.
Contoh ini menunjukkan cara melewati data dari Java ke Unity menggunakan 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);
}
}
Kelas Java com.unity3d.player.UnityPlayer
memiliki metode statis, setara dengan metode iOS: UnitySendMessage
. Ini digunakan di Java untuk lulus data ke Unity.
Meskipun UnitySendMessage
disebut dari dalam Unity, ia menyampaikan pesan menggunakan Java, kemudian Java memanggil kembali ke kode asli/Unity untuk memberikan pesan ke objek bernama “Main CameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
Lihat di Glossary”. Objek ini memiliki skrip yang melekat yang mengandung metode yang disebut JavaMessage
.
AndroidJavaObject
dan AndroidJavaClass
adalah metode yang sebanding (sebagai metode yang menggunakan JNI mentah). Menjaga jumlah transisi antara kode yang dikelola dan asli/Java untuk minimal, untuk kinerja yang lebih baik dan juga kejernihan kode.
//The first time you call a Java method like
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string"); // somewhat expensive
int hash = jo.Call<int>("hashCode"); // first time - expensive
int hash = jo.Call<int>("hashCode"); // second time - not as expensive as we already know the java method and can call it directly
Pengumpul garbage Mono harus melepaskan semua contoh yang dibuat dari AndroidJavaObject
dan AndroidJavaClass
setelah digunakan, tetapi disarankan untuk menyimpannya dalam pernyataan using(){}
untuk memastikan mereka dihapus sesegera mungkin. Tanpa ini, Anda tidak dapat yakin ketika mereka hancur. Jika Anda mengatur AndroidJNIHelper.debug
untuk benar, Anda akan melihat catatan aktivitas kolektor sampah dalam output debug.
//Getting the system language safely
void Start () {
using (AndroidJavaClass cls = new AndroidJavaClass("java.util.Locale")) {
using(AndroidJavaObject locale = cls.CallStatic<AndroidJavaObject>("getDefault")) {
Debug.Log("current lang = " + locale.Call<string>("getDisplayLanguage"));
}
}
}
2018–03–20 Sitemap
Fitur diperbarui di 5.5
Mendukung plug-ins file sumber Java ditambahkan untuk pemain Android di NewIn20182