目前从事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
创建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。
1、FB4.6中创建Flex库项目AneTestAS,创建时配置选择注意勾选包括Adobe AIR库
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 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版本。
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,重新运行手机项目即可。
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制作,大家可以参考