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的更多相关文章

  1. ANE 从入门到精通 --- 使用R* 访问资源

    在AIR4.0版本之前,ANE内无法使用R*,操作资源仅能使用getResourceID(). 对于接SDK来说尤为头疼. 不过4.0以后可以通过在打包时候指定platform.xml来直接使用R*访 ...

  2. ANE 从入门到精通 --- 一键打包ANE

    每次都要执行好几步才能编译出ANE很是麻烦,使用如下脚本 一键完成复杂的流程 REM 好压HaoZipC文件所在的位置,7Zip,WinRAR等均可 Set Zip=D:\"Program ...

  3. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步

    Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述     PV操作是对信号量进行的操作.     进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...

  4. cucumber java从入门到精通(3)简单实现及断言

    cucumber java从入门到精通(3)简单实现及断言 上一节里我们定义了step的java代码实现文件,step就是测试步骤及断言的集合,我们先定义出来,以后可以驱动开发以及在持续集成时重用. ...

  5. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

  6. ASP.NET MVC4入门到精通系列目录汇总

    序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...

  7. Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引

    因为内容比较多,所以每篇讲解一些内容,最后会放出全部代码,可以参考.操作中总会遇到各式各样的问题,个人对部分问题的研究在最后一篇 问题研究 里.欢迎大家探讨学习. 代码都经过个人测试,但仍可能有各种未 ...

  8. 1、ASP.NET MVC入门到精通——新语法

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...

  9. 7、ASP.NET MVC入门到精通——第一个ASP.NET MVC程序

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递 ...

随机推荐

  1. Codeforces Beta Round #6 (Div. 2 Only)

    A,B,C都是水题... D题,直接爆搜.我换了好多姿势,其实最简单的方法,就能过. #include <cstdio> #include <string> #include ...

  2. POJ 1474 Video Surveillance(半平面交)

    题目链接 2Y,模版抄错了一点. #include <cstdio> #include <cstring> #include <string> #include & ...

  3. Install the Maven in your computer

    While, this blog will talk about installing the Maven in your computer. There are three steps as fol ...

  4. 坐标系统与投影变换及在ArcGIS桌面产品中的应用

    坐标系统与投影变换及在ArcGIS桌面产品中的应用 1.地球椭球体(Ellipsoid) 2.大地基准面(Geodetic datum) 3.投影坐标系统(Projected Coordinate S ...

  5. twitter通过oAuth验证获取json数据

    protected void Page_Load(object sender, EventArgs e) { var oAuthConsumerKey = "你的key"; var ...

  6. Windows Phone 8 MVVM

    Why? 1 reason MVVM works really well with XAML based applications is because of the powerful XAML bi ...

  7. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

  8. [LintCode] Toy Factory 玩具工厂

    Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...

  9. Why does this json4s code work in the scala repl but fail to compile?

    I'm converting a json-like string into json, and the following code works in the scala repl import o ...

  10. cursor 手型样式

    cursor:hand 与 cursor:pointer 的效果是一样,都像手形光标.但用FireFox浏览时才注意到使用cursor:hand在FireFox里并被支持.cursor:hand :I ...