Reach 4 million Unity developers with your Android library Vitaliy - - PowerPoint PPT Presentation

reach 4 million unity developers
SMART_READER_LITE
LIVE PREVIEW

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


slide-1
SLIDE 1

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

slide-2
SLIDE 2

Why Unity?

slide-3
SLIDE 3

#AndroidDevDays

slide-4
SLIDE 4

#AndroidDevDays

Daily Users

225 450 675 900

Source: Unreleased McKinsey report; Facebook http://newsroom.fb.com/company-info/

M M M M

slide-5
SLIDE 5

#AndroidDevDays

225 450 675 900

Source: Unreleased McKinsey report; Facebook http://newsroom.fb.com/company-info/

Daily Users

M M M M

slide-6
SLIDE 6

#AndroidDevDays

Unity Developers

Unity

4M

Source: Unity Technologies

slide-7
SLIDE 7

#AndroidDevDays

Unity Developers

Unity

4M

18M

Worldwide

Source: Global Developer Population and Demographic Study 2014

slide-8
SLIDE 8

#AndroidDevDays

Unity Developers

Source: Unity Technologies

slide-9
SLIDE 9

#AndroidDevDays

Unity is Android

in game engine world

slide-10
SLIDE 10

#AndroidDevDays

slide-11
SLIDE 11

#AndroidDevDays

GetSocial Unity SDK Architecture

Android SDK iOS SDK

iOS Bridge Android Bridge C# API

Unity SDK

Java Objective C C#

slide-12
SLIDE 12

#AndroidDevDays

During Android Build

Android SDK iOS SDK

iOS Bridge Android Bridge C# API

Unity SDK

slide-13
SLIDE 13

#AndroidDevDays

Unity Game Structure

Android Mono VM Unity Core Unity C# Scripts

OS Apk

slide-14
SLIDE 14

#AndroidDevDays

Android Mono VM Unity Core Unity C# Scripts Java Code

?

Unity Game Structure

OS Apk

slide-15
SLIDE 15

#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

slide-16
SLIDE 16

#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

slide-17
SLIDE 17

Two-way communication

C# ↔ Java

slide-18
SLIDE 18

#AndroidDevDays

C# → Java

  • AndroidJavaObject
  • Pure JNI (Java Native Interface)

Java → C#

  • Unity Messaging
  • AndroidJavaProxy

Two Way Communication

slide-19
SLIDE 19

#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

slide-20
SLIDE 20

#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

  • Wrapper around java.lang.Object
slide-21
SLIDE 21

#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

slide-22
SLIDE 22

#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

slide-23
SLIDE 23

#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

slide-24
SLIDE 24

#AndroidDevDays

JNI is slooooow!

Respect 16ms rule

slide-25
SLIDE 25

#AndroidDevDays

Conclusion

Use AndroidJavaObject:

  • Less boilerplate
  • Less error prone
  • Faster (caching)

But:

  • JNI is more flexible
  • AndroidJavaObject has bugs
slide-26
SLIDE 26

#AndroidDevDays

AndroidJavaObject Bugs *

var result = javaObject.Call<TResult>(TParam param);

C#

  • we can’t pass string[] as TParam

(NoSuchMethodException)

  • we can’t return null objects from Java (Exception:

JNI: Init'd AndroidJavaObject with null ptr!)

* Tested on Unity 5.0.1f1

slide-27
SLIDE 27

#AndroidDevDays

C#

  • AndroidJavaObject
  • Pure JNI (Java Native Interface)

Java → C#

  • Unity Messaging
  • AndroidJavaProxy

Two Way Communication

slide-28
SLIDE 28

#AndroidDevDays

Unity Messaging

slide-29
SLIDE 29

#AndroidDevDays

UnityPlayer.UnitySendMessage( "GameController", "OnPushMessage", "New gift");

Java

Unity Messaging

slide-30
SLIDE 30

#AndroidDevDays

Pros:

  • Quick to implement

Cons:

  • Always 1 frame late
  • Only string parameters
  • Requires GameObject
  • Requires unity-classes.jar in classpath

Unity Messaging

slide-31
SLIDE 31

#AndroidDevDays

AndroidJavaProxy

Java

public interface IPushMessageListener { void onPushMessage(String message); }

  • Wrapper around java.lang.Proxy
slide-32
SLIDE 32

Java

public interface IPushMessageListener { void onPushMessage(String message); }

C#

public class PushMessageListener : AndroidJavaProxy { public PushMessageListener() : base("com.zasadnyy.IPushMessageListener") { … } void onPushMessage(string message) { … } }

AndroidJavaProxy

slide-33
SLIDE 33

#AndroidDevDays

Pros:

  • Immediate result
  • No type restriction on parameters
  • No extra dependencies on Java side

Cons:

  • Bug with null string parameter
  • Local reference table is limited to 512 entries

AndroidJavaProxy

slide-34
SLIDE 34

Devil is in the details

slide-35
SLIDE 35

#AndroidDevDays

Details

  • Unity is single threaded
  • Unity main thread != Android main thread
  • Implement equals() in all AndroidJavaProxy’ies
  • Differences between GameObject and Activity lifecycle
  • Keep calm and signal 11
slide-36
SLIDE 36

#AndroidDevDays

Thank you!

Presentation will be available at: v.zasadnyy.com/slides/ Vitaliy Zasadnyy @zasadnyy