Unity Android и Java. Демо сессия

Post on 30-Nov-2014

220 views 3 download

description

В предыдущем докладе были раскрыты основные секреты и хитрости разработки на Unity Android. На этот раз от теории переходим к практике. Будут показаны примеры и различные демо озвученых ранее технологий. Вы узнаете как написать android java plugin, использовать сторонние android java libraries в Вашем Unity проекте и многое другое. Кроме доклада, в течении всей конференции, буду рад ответить на Ваши вопросы по Unity Android и помочь практически. Приходите учиться, приходите за ответами, приходите с Вашими Unity проектами. Будет интересно :)

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

Спасибо за Ваше внимание

Вопросы?