Android Native Plugins
Artem KuzmenkoAndroid Software Engineer
Innovecs
Plan for each plugin
- Software used- Programming languages required- General steps- Information source, community help
- Personal experience- End users feedback
Common patternMain SDK
Bridge class
Helper class
End user’s code
Android
Cross-platform tool
Software used
- Eclipse- Sublime Text 2
Programming languages required
- Java- JavaScript
Activity
Cordova Plugin
General steps
MyPlugin.js
index.html
Android
PhoneGap
Cordova Plugin
- Java class extends CordovaPlugin (cordova.jar)- Add consts, implement all needed interfaces- “execute()” method
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (NAME_TO_POSITION_ACTION.equals(action)) {
JSONObject arg_object = args.getJSONObject(0);
String name = arg_object.getString("name");
int position = arg_object.getInt("position");
…
cordova.getActivity().runOnUiThread( … );
callbackContext.success();return true;
} else if ….
Return result to js
- From “execute()” method
boolean isReady = MainSdk.isReady();PluginResult result = new PluginResult(PluginResult.Status.OK, isReady);result.setKeepCallback(false);callbackContext.sendPluginResult(result);
- Primitives, JSONObject, JSONArray, byte array
PluginResult.Statuspublic enum Status { NO_RESULT, OK, CLASS_NOT_FOUND_EXCEPTION, ILLEGAL_ACCESS_EXCEPTION, INSTANTIATION_EXCEPTION, MALFORMED_URL_EXCEPTION, IO_EXCEPTION, INVALID_ACTION, JSON_EXCEPTION, ERROR}
Config.xml
<feature name="MyPlugin"> <param name="android-package" value="com.myphonegap.MyPlugin" /></feature>
index.html
<script type="text/javascript" src="js/myplugin.js"></script>
MyPlugin.jsMyPlugin.prototype.init = function(successCallback, errorCallback, arg1, arg2) { cordova.exec ( successCallback, // success callback function errorCallback, // error callback function 'MyPlugin', // mapped to our native Java class called "MyPlugin" 'init', // with this action name [ // and this array of custom arguments
{ "arg1": arg1,
"arg2": arg2}
] ); };
Information source, community help
- http://docs.phonegap.com/- https://github.com/phonegap/phonegap/wiki
Software used
- Eclipse- Unity- MonoDevelop-Unity
Programming languages required
- Java- C# or JavaScript
Main SDK
Bridge class
General steps
Helper class (o)
MonoBehaviour
Android
Unity3d
Bridge class
- Java, android project- Add external jar - Unity classes.jar
Unity\Editor\Data\PlaybackEngines\androiddevelopmentplayer\bin\classes.jar”
- Extend UnityPlayerActivity, Activity(to place in subview) - optional- Implement all needed interfaces, add public API- UnityPlayer (com.unity3d.player.UnityPlayer)
UnityPlayer.currentActivityUnityPlayer.UnitySendMessage(String gameObjectName, String method, String message)
- Resource id (string, array, bool, layout etc.)int id = getResources().getIdentifier(String name, String defType, String defPackage)
Helper class
- C# or JS- Add consts- Add interfaces for MonoBehaviours to implement- AndroidJavaObject for the bridge class (from constructor for ex.)
AndroidJavaObject mBridge = new AndroidJavaObject("com.bridge.package");mBridge .Call ("setGameObjectForCallback", gameObject.name);
- Add public functions which calls bridge APImBridge.Call ("setNameToPosition", name, position);mBridge.Call<bool>("isReady");
MonoBehaviour
- C# or JS- Implement interfaces- Initialize Helper class from onStart()
mHelper = new PluginHelper (gameObject);
- Call Helper functions from onStart(), onGUI() etc.mHelper.setNameToPosition(name, position);bool isReady = mHelper.isReady();
AndroidManifest.xml
- Default Unity manifest\Unity\Editor\Data\PlaybackEngines\androidplayer\AndroidManifest.xml
- Custom plugin manifest, add your permissions, services, activities etc.\Assets\Plugins\Android\AndroidManifest.xml
- Result manifestProject_Folder\Temp\StagingArea\AndroidManifest.xml
- Custom Main Activity<meta-data
android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
Pitfalls
- Resource ids- Hardware buttons: Back, Menu
Bridge class can have a boolean onBackPressed method
- Sensor, gyroscope when extending regular Activity
Information source, community help
- http://docs.unity3d.com/- http://answers.unity3d.com/- http://forum.unity3d.com/
AIR (Adobe Integrated Runtime)
Software used
- Eclipse- FlashDevelop- Adobe Flash Professional CS6
Programming languages required
- Java- ActionScript 3
FREContext
FREExtension
General steps
AIR Mobile AS3 bridge
Android
AIR
FREFunction
Air Native Extension
Java part
- FlashRuntimeExtensions.jar- MyExtension implements FREExtension (initialize, dispose)
@Overridepublic FREContext createContext(String contextType) {
return new MyContext();}
- MyContext extends FREContext@Override
public Map<String, FREFunction> getFunctions() { … }
FREFunction interface@Overridepublic FREObject call(FREContext context, FREObject[] args)
- argsgetAsString(), getAsInt(), getAsBool(), getAsDouble()
- return null or FREObject.newObject(...)String, int, boolean, double
- catch FREExceptionsFRETypeMismatchException, FREInvalidObjectException, FREWrongThreadException
etc.
- send async event to AS from FREFunctioncontext.dispatchStatusEventAsync(MyExtension.READY_EVENT, “ready”);
ActionScript bridge
- extends EventDispatcher- add consts- implement calls to Java FREContext
private static var context:ExtensionContext;
public static function setNameToPosition(name:String, position:int):void {context.call("setNameToPosition", name, position);
}
public static function isReady():Boolean {return context.call("isReady"); }
Extension.xml
- id - com.my.air.plugin.MyExtension
- versionNumber - 0.9
- nativeLibrary - MyAirPlugin.jar
- initializer - com.my.air.plugin.extensions.MyExtension
- finalizer - com.my.air.plugin.extensions.MyExtension
AndroidManifest.xml
- application.xml in FlashDevelop
Information source, community help
Native extensions for Adobe AIRhttp://www.adobe.com/devnet/air/native-extensions-for-air.html
Using native extensions for Adobe AIRhttp://help.adobe.com/en_US/air/build/WS597e5dadb9cc1e0253f7d2fc1311b491071-8000.html
Building a native extension for iOS and Androidhttp://www.adobe.com/devnet/air/articles/building-ane-ios-android-pt1.html