转载: http://sswilliam.blog.163.com/blog/static/189696383201191095759867/
NativeExtension结构及原理
一个NativeExtension项目主要有两个部分组成:As 端的库项目和底层代码的实现项目。我们以Android 上的NativeExtension为例,对一个NativeExtension项目进行讲解,下图是整个NativeExtension项目的体系结构。
一个NativeExtension项目主要分为两个部分, AS库和本地实现。
Actionscript 库项目
在AS库项目部分,开发者会定义需要自己需要扩展Actionscript的API,这些API的具体实现会映射到相应的Java代码。
在AS库项目部分最核心的类就是ExtensionContext。ExtensionContext负责与Java代码的交互。ExtensionContext会调用createExtensionContext方法创建和初始化Java端的本地代码。ExtensionContext的call方法可以调用具体的Java代码并获得返回结果。同时Extension还会接受从java代码抛出的事件。
Java项目
在Java实现部分需要引入AIRSDK中的FlashRuntimeExtensions.jar进行开发,下文地道的FREExtension,FREContext和FREFunction的den类和接口包含在FlashRuntimeExtensions.jar这个jar包中。
FREExtension是java端自定义代码的入口。FREExtension是一接口,需要用户重写createContext方法从而获得本地代码的上下文。AS库项目部分的ExtensionContext的createExtensionContext方法就会调用FREExtension的getContext方法从而获得Java代码的上下文。这个调用由AIR Runtime完成,不需要我们关心。
FREContext是是本地扩展的具体内容的提供者。我们需要重写getFunctions方法,从而返回本地扩展的具体的实现函数。同时FREContext也会提供一些与app相关的API以方便开发,具体请参考官方文档,下图是一些开发中常用的api
FREFunction是本地方法的具体实现。FREFunction是一个接口,提供了call方法。在AS端的ExtensionContext中调用的call方法都会映射到具体的FREFunction的call方法。
FREContext的getFunctions函数会返回一个Map,其key为一个自定义的String,value是具体的FREFunction。通过getFunction方法。AIR Runtime通过getFunction将AS端的call(key,args)方法和java端具体的FREFunctions的call(args)方法进行映射。如下图所示