ANE 从入门到精通 --- 简单的Whatever
Flash还是很好的,不过国内没人用. Whatever了. 以下是ANE制作中的一点笔记 分享下 也留作备份
Step1 编写As3 Library
package com.eran {
import flash.external.ExtensionContext;
import flash.system.Capabilities;
public class WhateverNameAS {
private static var mInstance:WhateverNameAS;
public static function get instance():WhateverNameAS {
if (mInstance == null) {
mInstance = new WhateverNameAS();
}
return mInstance;
}
private var mExtContext:ExtensionContext;
private var mIsMobile:Boolean;
public function WhateverNameAS() {
initialize();
}
private function initialize():void {
mIsMobile = Capabilities.manufacturer.indexOf("iOS") != -1 || Capabilities.manufacturer.indexOf("Android") != -1;
if (mIsMobile) {
mExtContext = ExtensionContext.createExtensionContext("HereISExtensionID", "HereISContextType");
if (mExtContext != null) {
mExtContext.call("initMe")
} else {
trace("Error: can't create context");
}
}
}
public function callFun1():void {
if (mIsMobile) {
if (mExtContext != null) {
mExtContext.call("fun1");
} else {
trace("Error: context is null");
}
}
}
}
}
编写后生成*.swc ,这里我命名为ANESWC.swc, 先放在某个目录留到后续步骤用
Step2 写Java 导出Jar包
主入口
package com.eran;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
public class HereIsMainEntry implements FREExtension {
@Override
public void initialize() {
}
@Override
public FREContext createContext(String s) {
if (s.equals("HereISContextType")) {
return new WhateverNameContext();
}
return null;
}
@Override
public void dispose() {
}
}
Context类
package com.eran;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.eran.fun.WhateverFun1;
import com.eran.fun.WhateverInitFun;
import java.util.HashMap;
import java.util.Map;
public class WhateverNameContext extends FREContext {
@Override
public Map<String, FREFunction> getFunctions() {
Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
functionMap.put("initMe", new WhateverInitFun());
functionMap.put("fun1", new WhateverFun1());
return functionMap;
}
@Override
public void dispose() {
}
}
Fun1
package com.eran.fun;
import android.widget.Toast;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
public class WhateverFun1 implements FREFunction {
@Override
public FREObject call(FREContext freContext, FREObject[] freObjects) {
Toast.makeText(freContext.getActivity(), "WhateverFun1 called", Toast.LENGTH_SHORT).show();
return null;
}
}
Init Fun
package com.eran.fun;
import android.widget.Toast;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
public class WhateverInitFun implements FREFunction {
@Override
public FREObject call(FREContext freContext, FREObject[] freObjects) {
Toast.makeText(freContext.getActivity(), "WhateverInitFun called", Toast.LENGTH_SHORT).show();
return null;
}
}
打包Jar流程, Intellij Idea 13~15 流程都一样
Artifacts 选择 From modules

选择刚写的Java工程

改掉导出的Jar名称,并且去除被Import进来的 FlashRuntimeExtensions.jar
这个文件我是直接从AIR SDK 目录里面直接复制到工程的lib目录 同时设置了引用

最终的效果图

运行打包后应该生成 *.jar文件, 这里我的Jar文件叫WhateverJAR.jar
Step3 创建打包用的目录

在任意位置创建一个文件夹,内部结构如上图. 其中
adt.jar 文件是从AIR SDK中直接复制过来,
ANESWC.swc 是Step1中生成
将ANESWC.swc 用解压工具解压,将里面的library.swf 分别放入 Android-ARM目录和default 目录
将Step2 生成的Jar包WhateverJAR.jar 放入 Android-ARM目录
extension.xml 文件 内容如下
<extension xmlns="http://ns.adobe.com/air/extension/20.0">
<id>HereISExtensionID</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="Android-ARM">
<applicationDeployment>
<nativeLibrary>WhateverJAR.jar</nativeLibrary>
<initializer>com.eran.HereIsMainEntry</initializer>
<finalizer>com.eran.HereIsMainEntry</finalizer>
</applicationDeployment>
</platform>
<platform name="default">
<applicationDeployment/>
</platform>
</platforms>
</extension>
其中 http://ns.adobe.com/air/extension/20.0 是我用到的AIR SDK 版本号(我用的是AIR SDK20 所有版本是20.0)
id 字段就是在Step1中创建Context所填的第一个参数
mExtContext = ExtensionContext.createExtensionContext("HereISExtensionID", "HereISContextType");
同时注意该字段也是测试工程的 *-app.xml中 引用当前ANE所使用的名字
<extensions>
<extensionID>HereISExtensionID</extensionID>
</extensions>
而函数的第二个字段 "HereISContextType" 是Step2中 传入Java的入口文件HereIsMainEntry.java 的参数
@Override
public FREContext createContext(String s) {
if (s.equals("HereISContextType")) {
return new WhateverNameContext();
}
return null;
}
编辑build.bat
@echo off cd /d %~dp0 set adt=java -jar adt.jar set ane=AneT1.ane set target=ane %ane% .\extension.xml set swc=./ANESWC.swc set platform-android=-platform Android-ARM -C ./Android-ARM . set platform-default=-platform default -C ./default . echo Packaging... if exist %ane% del %ane% > nul %adt% -package -target %target% -swc %swc% %platform-ios-arm% %platform-ios-x86% %platform-android% %platform-default% echo Finish! pause
运行build.bat 生成最终AneT1.ane, 导出测试工程
最终生成的Ane结构如下:

总结:
生成了default平台,这样在PC端进行调试时候 不会出现该ANE只适合Android 从而无法再PC模拟器运行的情况
同时ANE的swc内部 通过
mIsMobile = Capabilities.manufacturer.indexOf("iOS") != -1 || Capabilities.manufacturer.indexOf("Android") != -1;
确保其ANE一定运行在Mobile环境中, PC环境仅仅是个空实现
ANE 从入门到精通 --- 简单的Whatever的更多相关文章
- ANE 从入门到精通 --- 使用R* 访问资源
在AIR4.0版本之前,ANE内无法使用R*,操作资源仅能使用getResourceID(). 对于接SDK来说尤为头疼. 不过4.0以后可以通过在打包时候指定platform.xml来直接使用R*访 ...
- ANE 从入门到精通 --- 一键打包ANE
每次都要执行好几步才能编译出ANE很是麻烦,使用如下脚本 一键完成复杂的流程 REM 好压HaoZipC文件所在的位置,7Zip,WinRAR等均可 Set Zip=D:\"Program ...
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述 PV操作是对信号量进行的操作. 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...
- cucumber java从入门到精通(3)简单实现及断言
cucumber java从入门到精通(3)简单实现及断言 上一节里我们定义了step的java代码实现文件,step就是测试步骤及断言的集合,我们先定义出来,以后可以驱动开发以及在持续集成时重用. ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
- ASP.NET MVC4入门到精通系列目录汇总
序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...
- Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引
因为内容比较多,所以每篇讲解一些内容,最后会放出全部代码,可以参考.操作中总会遇到各式各样的问题,个人对部分问题的研究在最后一篇 问题研究 里.欢迎大家探讨学习. 代码都经过个人测试,但仍可能有各种未 ...
- 1、ASP.NET MVC入门到精通——新语法
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...
- 7、ASP.NET MVC入门到精通——第一个ASP.NET MVC程序
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递 ...
随机推荐
- SQL笔记----在一个关系表中操作列
使用alter关键字,可以为一个表添加新的列. 比如: 给Persons的表中添加一列,名字为Birthday,类型是date. ALTER TABLE Persons ADD Birthday da ...
- ASP.NET状态保持方案若干
客户端方案: 1.ViewState 2.隐藏域 3.cookie 大小4KB限制,不消耗服务器资源,可配置到期时间,但安全性不高,还被客户端禁用. 4.QueryString 方法简单,但不安全,有 ...
- error===>ld: 2 duplicate symbols for architecture x86_64
一,经历 1> 出现了以下错误,感觉像是GiftAnimationView文件的问题 /Users/liuzhu/Library/Developer/Xcode/DerivedData/test ...
- 递归函数的用法及array_merge的用法
$info=M('navclass')->select(); function getAllArray($data, $pid =1) { $arr = array(); foreach ($d ...
- iOS9 升级XCode7遇到的问题收集
开发环境运行 各位可能会觉得,笔者在此还要讲开发环境的运行,是不是多此一举.其实并非如此,综合笔者这几年iOS开发经验的总结,运行新版本,特别是测试版本的Xcode是一个需要格外小心的事情, ...
- unix network programming volume1 sorce code build and get(UNIX網絡編程卷1第三版)
source code下载地址:unpv13e.tar.gz下载 (也有放一份在google cloud storage) compile 1. ./configure 2. cd lib make ...
- solrcloud线上创建collection,修改默认配置
一.先看API,创建collection 1.上传配置文件到zookeeper 1) 本地内嵌zookeeper集群:java -classpath ./solr-webapp/webapp/WEB- ...
- 用c#实现$.now()(1437813924915)的时间效果
Convert.ToInt64((DateTime.UtcNow - Convert.ToDateTime("1970-01-01")).TotalMilliseconds)
- HTML中忽略的小问题
1.padding和margin 例子 1 padding:10px 5px 15px 20px;(上,右,下,左) 上内边距是 10px 右内边距是 5px 下内边距是 15px 左内边距是 20p ...
- HTML 父元素与子元素之间的margin-top问题
问题: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. 代码如下: <div ...