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

Transcript
Page 1: Unity Android и Java. Демо сессия

Unity Android и Java

Демо сессия

Page 2: 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.

Page 3: Unity Android и Java. Демо сессия

Unity Android Player

. Native. Написан на С,C++/Android NDK

. Единственный способ работать быстро

. Кратчайший доступ к драйверам, библиотекам и сервисам. Java: DVM/ART

Page 4: Unity Android и Java. Демо сессия

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 }

Page 5: Unity Android и Java. Демо сессия

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. Демо

Page 6: Unity Android и Java. Демо сессия

Java Exception Propagation

. Что если при использовании Android JNI Helper на стороне Java произойдет исключение?. Реальный пример из жизни – JNI Call stack, 512 entries. Демо : Java Exception Propagation

Page 7: Unity Android и Java. Демо сессия

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

Page 8: Unity Android и Java. Демо сессия

Android Java Plugins (AJP)

. Assets->Plugins->Android folder

. single jar

. multiple jars

. Демо

Page 9: Unity Android и Java. Демо сессия

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/

Page 10: Unity Android и Java. Демо сессия

Android Java Proxy

. Java Interfaces accessible in Unity C#

. Android Java Runnable : RunOnUiThread

. Демо : https://code.google.com/p/yuku-android-util/source/browse/AmbilWarna/

Page 11: Unity Android и Java. Демо сессия

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>

Page 12: Unity Android и Java. Демо сессия

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

Page 13: Unity Android и Java. Демо сессия

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

Вопросы?