Flex ANE制作打包流程

目前从事Flex4+Java桌面应用开发,项目中应用很多ane文件,想了解ane文件原理及制作打包过程。
本篇博客记录自己制作Flex AIR ane步骤,遇到的问题及解决方案。原理,底层细节等本篇就不介绍了,可参考本文末尾的参考资料。
ane可以运行在三个平台中:
ane+ios,ane+Android(java)(jar),ane+Windows(c++/c#)(dll) 。
在Windows平台通过AIR调用jar生成ane,会一直报错找不到制定方法。。。(才发现这种方式行不通,哭晕在厕所)

文章末尾提供了本文测试所用的jar,swc,打包命令等资料。

下面介绍制作打包ane的步骤

一、准备工作

1、Flash Builder 4.6
2、Myeclipse或eclipse
3、Adt.jar
4、数字签名证书(可以在FB4.6中随意建一个air项目,然后到处发行版,创建一个)
5、解压缩软件
6、JDK/JRE

二丶创建jar

创建java项目,并导入Flex SDK的lib/Android目录下的FlashRuntimeExtensions.jar
1、创建一个TestExtension类,实现FREExtension接口,该类是AS与Java交互的最基础的入口。

package com.agree.ane;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
//这个类是AS与JAVA交互的最基础的入口
public class TestExtension implements FREExtension {

    @Override
    public FREContext createContext(String arg0) {

        return new TestContext();
    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    @Override
    public void initialize() {
        // TODO Auto-generated method stub

    }

}

2、创建一个Context类,继承FREContext类,覆写getFunctions方法,这个方法是定义AS与Java具体方法通讯的接口。

package com.agree.ane;

import java.util.HashMap;
import java.util.Map;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;

public class TestContext extends FREContext {

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    @Override
    public Map getFunctions() {
        // 下面这个比较关键,它的作用是定义as与JAVA具体方法通信的重要接口
        Map functionMap=new HashMap();
        functionMap.put("testFunction",new TestFunction());
        return functionMap;
    }

}

3、创建一个Function类,实现FREFunction接口,实现call方法。

package com.agree.ane;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
import com.adobe.fre.FREWrongThreadException;

public class TestFunction implements FREFunction {

    @Override
    //这个类作用就是 AS调用CALL方法给java传一个FREObject的参数组,然后,java给as返回一个FREObject
    public FREObject call(FREContext arg0, FREObject[] arg1) {

        FREObject result=null;
        try {
            result=FREObject.newObject("Ane测试");
        } catch (FREWrongThreadException e) {
            e.printStackTrace();
        }
        return result;
    }

}

导出AneTestJava.jar
这里注意jdk的 版本。按照网上搜索到的信息,最好jdk版本控制在1.6。本篇文章测试时使用的是jdk1.6.0_43。

三丶创建Flex库项目swc

1、FB4.6中创建Flex库项目AneTestAS,创建时配置选择注意勾选包括Adobe AIR库
Flex ANE制作打包流程_第1张图片
2、创建一个as类

package git.ane.test
{
    import flash.external.ExtensionContext;

    public class CallJava
    {

        public var context:ExtensionContext;

        public function CallJava()
        {
            context=ExtensionContext.createExtensionContext("com.agree.ane.TestExtension",null);
        }

        public function callJavaTest():String{
            trace(JSON.stringify(context));
            return context.call("testFunction",null)+"";
        }
    }
}

注意这个类中的createExtensionContext方法的第一个参数和call方法的第一个参数。
*createExtensionContext方法的第一个参数com.agree.ane.TestExtension需要与第四步中创建的extension.xml中的id一致。
*call方法的第一个参数testFunction需要与上面jar中TestContext类的getFunctions方法中map的key对应,如果有多个,则需要定义多个TestFunction类,每个类中实现自己的实际业务。
3、构建库项目,生成AneTestAS.swc文件。

四、创建extension.xml文件

<extension xmlns="http://ns.adobe.com/air/extension/3.1">
    <id>com.agree.ane.TestExtensionid>
    <versionNumber>1.0.0versionNumber>
    <platforms>
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>AneTestJava.jarnativeLibrary>
                <initializer>com.agree.ane.TestExtensioninitializer>
                <finalizer>com.agree.ane.TestExtensionfinalizer>
            applicationDeployment>
        platform>
    platforms>
extension>

1、注意这里的命名空间http://ns.adobe.com/air/extension/3.1,版本一定要与adl.exe版本一致。
可以在FB4.6安装目录下查看adl版本。
Flex ANE制作打包流程_第2张图片
2、id标签必须与AneTestAS库项目中CallJava类中createExtensionContext的第一个参数一致。
3、Platform标签的name属性必须为Android-ARM,完全匹配。若是桌面应用必须为Windows-x86,也必须是完全匹配。
4、nativeLibrary标签的值为第一步中导出的jar包。
5、Initializer/finalizer的值为第一步中导出的jar包中TestExtension类的完全包名,允许没有finalizer标签。

五丶打包

1、使用压缩软件打开AneTestAS.swc,并解压得到catalog.xml和library.swf两个文件
2、在FB4.6安装目录sdks\4.6.0\lib下拿到adt.jar
3、将AneTestJava.jar,AneTestAS.swc,catalog.xml,library.swf,extension.xml,adt.jar复制到某一个文件夹下,并在该文件夹中按住shift键+点击鼠标右键,选择“在此处打开命名窗口”或者cmd命令进入该文件夹所在目录中
4、在打开的cmd窗口中输入。其实这里可以采用ant的build.xml进行构建打包,博主还在学习中,后面可以更新上来。

java -jar adt.jar -package -tsa none -storetype pkcs12 -keystore aa.p12 -storepass 123456 -target ane m.ane extension.xml -swc AneTestAS.swc -platform Android-ARM AneTestJava.jar library.swf

(1)-tsa none 可以避免时间戳和去Adobe官网认证之类的(这点可能说的不对),希望知道的大神告诉下
(2)-keystore aa.p12 aa.p12采用aa.p12数字签名证书
(3)-storepass 123456 指定数字签名证书的密码
(4)-target ane m.ane 指定要制作的ane的文件名
(5)-platform Android-ARM 这里的platform值必须与extension.xml中platform标签的name属性一致。
这里还有-C的参数可以使用,可惜不会使用,学习中。
通过该cmd命令即可在当前目录得到m.ane文件。

六丶使用

1、创建Flex手机项目
2、右击项目,选择属性,在属性面板中选择Flex构建路径条目,选择本机扩展页签,添加ANE。属性面板中选择Flex构建打包条目下的Google Android条目,选择本机扩展页签,在已显示的m.ane行,勾选包,点击确定保存设置。
3、在Flex手机项目中使用该ane。
必须要注意ane不支持模拟器,必须在真实设备上进行调试。若是使用模拟器则会报错“Requested extension com.adobe.Vibration is not supported for Windows-x86 ”

制作打包例子下载包括jar,swc,打包命令及制作流程

写在最后

若是运行该手机项目时报错
“Registry key ‘Software/JavaSoft/Java Runtime Environment/CurrentVersion’
has value ‘1.8’, but ‘1.7’ is required.
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment.”
请检查jdk版本,可能是之前电脑安装了多个jdk版本导致注册表出问题。
解决办法:
通过cmd窗口regedit命令快速打开注册表,找到这个路径:
HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment,修改CurrentVersion对应的值为1.7,重新运行手机项目即可。
Flex ANE制作打包流程_第3张图片

参考资料

http://www.ithao123.cn/content-884869.html JDK错误解决方案
https://forums.adobe.com/message/4717194 模拟器报错问题
http://blog.csdn.net/linxcool/article/details/7770179 ane原理
http://blog.sina.com.cn/s/blog_5d323f950101d6rc.html ane原理
http://blog.sina.com.cn/s/blog_5d323f950101d4a4.html ane制作,大家可以参考

你可能感兴趣的:(Flex4,ane)