Unity Android и Java. Демо сессия
-
Upload
flash-gamm -
Category
Presentations & Public Speaking
-
view
219 -
download
3
description
Transcript of Unity Android и Java. Демо сессия
Unity Android и Java
Демо сессия
О докладчике
. 10+ лет в игроиндустрии (в том числе в отечественной) в разных компаниях: Toolsmedia, LG Electronics, Creat Studios, Reaxion и т.д.
. Множество выпущенные проектов на платформах от PC/PS2 до iOS/Android/Brew/J2ME/Symbian.
. Больше 3х лет в Unity Technologies, в качестве QA по мобильным платформам: Android/Windows Phone 8.
Unity Android Player
. Native. Написан на С,C++/Android NDK
. Единственный способ работать быстро
. Кратчайший доступ к драйверам, библиотекам и сервисам. Java: DVM/ART
Android JNI Helper. Java Native Interface. Java Native Interface (JNI) is a programming framework that allows Java code running in the Java virtual machine (JVM) to call and be called by native applications
jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* jni_env = 0; vm->AttachCurrentThread(&jni_env, 0); }
…
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 }
Android JNI Helper. Wrapper. Helper. Зачем?
. UnityEngine.AndroidJNI is a wrapper for the JNI calls available in C. All methods in this class are static and have a 1:1 mapping to the Java Native Interface.
. UnityEngine.AndroidJNIHelper provides helper functionality used by the next level, but is exposed as public methods because they may be useful for some special cases.
//The comments describe what you would need to do if you were using raw JNI 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);
. Android Java Class + Android Java Object. Демо
Java Exception Propagation
. Что если при использовании Android JNI Helper на стороне Java произойдет исключение?. Реальный пример из жизни – JNI Call stack, 512 entries. Демо : Java Exception Propagation
Android Native Plugins (ANP). Android NDK / shared libs. Assets->Plugins->Android folder
extern "C" { float FooPluginFunction (); }
…
[DllImport ("PluginName")] private static extern float FooPluginFunction ();
. Демо : Native QR Code Scanner
Android Java Plugins (AJP)
. Assets->Plugins->Android folder
. single jar
. multiple jars
. Демо
Android Library Projects (ALP). Android Project: http://developer.android.com/tools/projects/index.html#ApplicationProjects
. Стадартизация библиотек: http://developer.android.com/tools/projects/index.html#LibraryProjects
. Множество уже написанных библиотек
. Резрешение конфликта ресурсов
. Демо: https://code.google.com/p/yuku-android-util/source/browse/AmbilWarna/
Android Java Proxy
. Java Interfaces accessible in Unity C#
. Android Java Runnable : RunOnUiThread
. Демо : https://code.google.com/p/yuku-android-util/source/browse/AmbilWarna/
Android Manifest<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:theme="@android:style/Theme.NoTitleBar" android:versionCode="1" android:versionName="1.0" package="com.testing.AmbilWarna" android:installLocation="preferExternal"> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" /> <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false"> <activity android:label="@string/app_name" android:name="com.unity3d.player.UnityPlayerNativeActivity" android:screenOrientation="portrait" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /> </activity> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /></manifest>
Java Plugins and Unity versions
Unity 3.5 Android Java Plugins• Custom Manifest: 3 unity activities• Manual conflicts resolving. Плагины с ссылками на ресурсы.• Нет поддержки ALP
Unity 4.3 Android Java Plugins• Custom manifest: unity native activity only• Support for old (3.5) Android Plugins custom manifest• Поддержка ALP. Лучший способ для плагинов со ссылками на ресурсы
Unity 5.0 Android Java Plugins• Android plugin importer. Только для “простых” jar. Можно поместить где угодно.• No Support for old (3.5) Android Plugins custom manifest• Поддержка ALP. См. Выше
Если Вы пишете плагины, то настоятельно рекомендуем ипользовать формат ALP
Спасибо за Ваше внимание
Вопросы?