AAR plug-ins dan Android Perpustakaan
Memperpanjang UnityPlayerActivity Kode Java

JAR plug-ins

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:

JAR plug-in import settings as displayed in the Inspector window
Pengaturan impor JAR plug-in seperti yang ditampilkan di jendela Inspector

Menggunakan plug-in Java

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#.

File sumber Java sebagai plug-ins

Saat menggunakan sistem build Gradle, Anda dapat menghindari membuat file JAR. Untuk melakukan ini:

  1. Drop file .java ke proyek Unity Anda sebagai plug-in.
  2. Pada Plugin Inspector, tanda plug-in untuk platform Android.
  3. Ketika bangunan untuk Android, pastikan GradleSistem build Android yang mengotomatiskan beberapa proses build. Otomasi ini berarti bahwa banyak kesalahan build umum cenderung terjadi. More info
    Lihat di Glossary
    ditetapkan sebagai Build System Anda di Membangun Pengaturan.

Unity menyalin file java ke proyek Gradle dan membangun dengan itu.

Menggunakan plug-in Java Anda dari kode asli (C/C++)

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

Menggunakan plug-in Java Anda dari skrip C# dengan kelas pembantu

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:

  • mentah JNI melalui metode 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.

Examples

Contoh 1

 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 2

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 3

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.

Praktik terbaik saat menggunakan plug-ins Java dengan Unity

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

AAR plug-ins dan Android Perpustakaan
Memperpanjang UnityPlayerActivity Kode Java