本文内容借鉴:
http://blog.csdn.net/suncle8835/article/details/9186857
http://blog.sina.com.cn/s/blog_5d323f950101d4a4.html
http://blog.csdn.net/u012146107/article/details/15813057
(一)Android本地库编写
1. 从Adobe Flash Builder安装目录下的\sdks\4.6.0\lib\android 提取Android中需要的jar包FlashRuntimeExtensions.jar;
2.自定义Function类,实现FREFunction接口,完成想要进行的操作,这里是完成Toast(Function类可以定义多个,之后都在自定义的Context的getFunctions方法的map中绑定key)
package com.jingjie.anedemo.rewrite;
import android.widget.Toast;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREInvalidObjectException;
import com.adobe.fre.FREObject;
import com.adobe.fre.FRETypeMismatchException;
import com.adobe.fre.FREWrongThreadException;
/**
* 自定义Function类,实现FREFunction接口
*
* @author Geny
*
*/
public class TestToastFunction implements FREFunction {
@Override
public FREObject call(FREContext context, FREObject[] params) {
// TODO Auto-generated method stub
FREObject msg = params[0];//从Flash中传过来的值
FREObject result = null;//将要返回给Flash的值
try {
Toast.makeText(context.getActivity(),
"测试成功,Android本地被调用," + msg.getAsString(), Toast.LENGTH_LONG)
.show();
result = FREObject.newObject("这是可返回的值");
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FRETypeMismatchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FREInvalidObjectException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FREWrongThreadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}<pre class="plain" name="code">
3.自定义Context类,继承FREContext类,设置一个key,将来在AS类中根据key找到对应的方法
package com.jingjie.anedemo.rewrite;
import java.util.HashMap;
import java.util.Map;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
/**
* 自定义Context类,继承FREContext类
* @author Geny
*
*/
public class TestContext extends FREContext {
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public Map<String, FREFunction> getFunctions() {
// TODO Auto-generated method stub
HashMap<String, FREFunction> map = new HashMap<String, FREFunction>();
map.put("testToast", new TestToastFunction());
//可继续put其他function
return map;
}
}<pre class="plain" name="code">
4.自定义Extension类,实现FREExtension接口
package com.jingjie.anedemo.rewrite;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
/**
* 自定义Extension类,实现FREExtension接口
* @author Geny
*
*/
public class TestExtension implements FREExtension {
@Override
public FREContext createContext(String arg0) {
// TODO Auto-generated method stub
return new TestContext();
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void initialize() {
// TODO Auto-generated method stub
}
}<pre class="plain" name="code">
5.将编写好的程序打包成jar包,Export - JAR File,右侧配置中的内容可以不选,选择保存位置及文件名,Finish
(二)Flash与Android的交互
1.创建一个Flex库项目,配置选择手机库,Finish
2.在默认包中新建一个extension.xml文件,内容如下:
<extension xmlns="http://ns.adobe.com/air/extension/2.5">
<id>com.adobe.ane.test</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="Android-ARM">
<applicationDeployment>
<nativeLibrary>Toast.jar</nativeLibrary><!-- 之前导出的jar包 -->
<!--即为Android本地FREExtension全路径 -->
<initializer>com.jingjie.anedemo.rewrite.TestExtension</initializer>
<finalizer>com.jingjie.anedemo.rewrite.TestExtension</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension><pre class="plain" name="code">
3.编写一个AS类Extension,主要作用是创建ExtensionContext与Android的Native代码交互(建议使用单例)
package
{
import flash.external.ExtensionContext;
public class Extension
{
public static const KEY:String = "testToast";//与java端中Map里的key一致
public static const EXTENSION_ID:String = "com.adobe.ane.test";//与extension.xml中的id标签一致
private var extContext:ExtensionContext;
// private static var _instance:Extension;
//
// public static function getInstance():Extension {
// if(Extension._instance == null) {
// Extension._instance = new Extension();
// }
// return Extension._instance;
// }
public function Extension()
{
//第二个为参数,会传入java代码中的FREExtension的createContext方法
extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,"");
}
public function hello(name:String):String
{
if (extContext)
{
return extContext.call(KEY,name) as String;
}
return "call failed";
}
}
}<pre class="plain" name="code">
4.编译得到.swc文件。
到此为止,打包ANE所需要的文件都有啦,接下来开始打包ANE
(三)打包ANE
1.通过(一)(二)步我们能获得三个文件,Toast.jar、extension.xml、ANEToastLibrary.swc,将ANEToastLibrary.swc的后缀名改为.rar解压或直接解压获得library.swf文件,到此为止四个文件准备完全。
2.新建一个文件夹,并在文件夹中新建命名为Android-ARM的文件夹,将ANEToastLibrary.swc和extension.xml放在一级目录中,library.swf和Toast.jar放在Android-ARM中
3.通过命令进入这个目录,并输入adt -package -target ane toast.ane(可随意命名为*.ane) extension.xml -swc *.swc -platform Android-ARM -C Android-ARM . (注意结尾有个" . ",不写的话会报错),打包完毕后会在目录中看到.ane文件,有时候会报swf version版本低,需要在Flex库编译器中附件的编译参数中添加-swf-version 13即可
至此,ANE打包完毕,接下来是ANE的使用方法
(四)ANE的使用
1.创建Flex手机项目,选择Android为目标平台
2.Properties - Flex库构建路径 - 本机扩展,将刚刚打包好的ANE添加进来,并在Flex构建打包 - Google Android - 本机扩展中勾选checkbox,千万记得不是将ANE添加进来就OK了,一定要勾选checkbox,勾选checkbox,重要的事情说三遍,OK,接下来就可以使用啦
3.输入测试数据,测试是否成功
var anetest:Extension = new Extension;
anetest.hello("试试能不能用");<pre class="plain" name="code">
OK,到此一个ANE的打包和测试就结束了,有问题可以留言哈,看见就回。
Android本地编写资源地址:http://download.csdn.net/detail/jie_0754/9629087
Flash与Android交互资源地址:http://download.csdn.net/detail/jie_0754/9629096