Reach 4 million Unity developers
with your Android library
Vitaliy Zasadnyy Senior Unity Dev @ GetSocial Manager @ GDG Lviv Ankara Android Dev Days May 11-12 , 2015
Reach 4 million Unity developers with your Android library Vitaliy - - PowerPoint PPT Presentation
Reach 4 million Unity developers with your Android library Vitaliy Zasadnyy Ankara Android Dev Days Senior Unity Dev @ GetSocial May 11-12 , 2015 Manager @ GDG Lviv Why Unity? #AndroidDevDays Daily Users 0 225 450 675 900 M M M M
with your Android library
Vitaliy Zasadnyy Senior Unity Dev @ GetSocial Manager @ GDG Lviv Ankara Android Dev Days May 11-12 , 2015
#AndroidDevDays
#AndroidDevDays
Daily Users
225 450 675 900
Source: Unreleased McKinsey report; Facebook http://newsroom.fb.com/company-info/
M M M M
#AndroidDevDays
225 450 675 900
Source: Unreleased McKinsey report; Facebook http://newsroom.fb.com/company-info/
Daily Users
M M M M
#AndroidDevDays
Unity Developers
Unity
Source: Unity Technologies
#AndroidDevDays
Unity Developers
Unity
Worldwide
Source: Global Developer Population and Demographic Study 2014
#AndroidDevDays
Unity Developers
Source: Unity Technologies
#AndroidDevDays
in game engine world
#AndroidDevDays
#AndroidDevDays
GetSocial Unity SDK Architecture
Android SDK iOS SDK
iOS Bridge Android Bridge C# API
Unity SDK
Java Objective C C#
#AndroidDevDays
During Android Build
Android SDK iOS SDK
iOS Bridge Android Bridge C# API
Unity SDK
#AndroidDevDays
Unity Game Structure
Android Mono VM Unity Core Unity C# Scripts
OS Apk
#AndroidDevDays
Android Mono VM Unity Core Unity C# Scripts Java Code
Unity Game Structure
OS Apk
#AndroidDevDays
Android / Java Unity / C# primitive types primitive types java.lang.String string java.lang.Object AndroidJavaObject java.lang.Class AndroidJavaClass java.lang.Runnable AndroidJavaRunnable java.lang.Proxy AndroidJavaProxy
Provided Wrappers
#AndroidDevDays
Android / Java Unity / C# primitive types primitive types java.lang.String string java.lang.Object AndroidJavaObject java.lang.Class AndroidJavaClass java.lang.Runnable AndroidJavaRunnable java.lang.Proxy AndroidJavaProxy
Provided Wrappers
C# ↔ Java
#AndroidDevDays
C# → Java
Java → C#
Two Way Communication
#AndroidDevDays
Sample Java class
public class Speaker { private String name; public Speaker(String name) { … } public static Speaker copy(Speaker speaker) { … } public String askQuestion(String question) { … } }
Java
#AndroidDevDays
C#
var jSpeaker = new AndroidJavaObject( “com.zasadnyy.Speaker”, “Vitaliy”); var jClone = jSpeaker.CallStatic<AndroidJavaObject>( “copy”, jSpeaker); var answer = jSpeaker.Call<string>(“askQuestion”, “HDYD?”);
AndroidJavaObject
#AndroidDevDays
C#
// var jSpeaker = new AndroidJavaObject( // “com.zasadnyy.Speaker”, “Vitaliy”); IntPtr classID = jni.FindClass("com.zasadnyy.Speaker"); IntPtr constructorID = jni.GetMethodID(classID, "<init>", "(Ljava/lang/String;)V"); IntPtr javaString = jni.NewStringUTF("Vitaliy"); IntPtr objectID = jni.NewObject(classID, constructorID, javaString); "(Ljava/lang/String;)V"
Pure JNI
#AndroidDevDays
B byte S short C char V void F float Z boolean I int Lclass; class J long [type> array of type
JNI Cheatsheet
#AndroidDevDays
B byte S short C char V void F float Z boolean I int Lclass; class J long [type> array of type
long myMethod(int n, String s, int[] arr) (ILjava/lang/String;[I>)J
JNI Cheatsheet / Example
#AndroidDevDays
Respect 16ms rule
#AndroidDevDays
Conclusion
Use AndroidJavaObject:
But:
#AndroidDevDays
AndroidJavaObject Bugs *
var result = javaObject.Call<TResult>(TParam param);
C#
(NoSuchMethodException)
JNI: Init'd AndroidJavaObject with null ptr!)
* Tested on Unity 5.0.1f1
#AndroidDevDays
C#
Java → C#
Two Way Communication
#AndroidDevDays
Unity Messaging
#AndroidDevDays
UnityPlayer.UnitySendMessage( "GameController", "OnPushMessage", "New gift");
Java
Unity Messaging
#AndroidDevDays
Pros:
Cons:
Unity Messaging
#AndroidDevDays
AndroidJavaProxy
Java
public interface IPushMessageListener { void onPushMessage(String message); }
Java
public interface IPushMessageListener { void onPushMessage(String message); }
C#
public class PushMessageListener : AndroidJavaProxy { public PushMessageListener() : base("com.zasadnyy.IPushMessageListener") { … } void onPushMessage(string message) { … } }
AndroidJavaProxy
#AndroidDevDays
Pros:
Cons:
AndroidJavaProxy
#AndroidDevDays
Details
#AndroidDevDays
Presentation will be available at: v.zasadnyy.com/slides/ Vitaliy Zasadnyy @zasadnyy