守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 2716|回复: 0
打印 上一主题 下一主题

[Android] 创建一个简单ANE

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52903
    钢镚
    1422

    开源英雄守望者

    跳转到指定楼层
    楼主
    发表于 2014-12-29 23:07:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    在这里记录一下创建一个简单功能的ANE的操作步骤。在这里将创建一个可以在AIR as里调用的log方法。调用后,可以将日志信息打印到android底层的日志系统。就是可以用adb logcat命令查看。
    (关于android里的api和功能,ane内部的详细结构。本文暂不详细提及,请关注我的后续文章 ^_^)
    一个ANE通常包括两个部分。AS部分和底层代码(专业的叫本地代码)部分,本文中的本地代码就是java(严格来说,其实还包括一个配置文件,叫做拓展描述符文件extention.xml,文件名可以取别的,打包命令中注意就是了)。
    1、AS部分代码的创建
    我这里用的开发工具是fb4.7。
    创建一个flex库项目。我为这个项目命名为ANE_log。一些文章里说,这里要注意钩上 包括air库。其实,可以不钩上的。理论上来说,ane不需要air库里的api,你也可以自己试试不钩上。




    在src里创建包和类。
    我的代码如下。
    1. package randy.util.log{
    2. import flash.external.ExtensionContext;
    3. public class LogUtil{
    4. private static var _extensionContext:ExtensionContext = null;
    5. private static const EXTENSION_ID:String = "randyUtilLog";
    6. private static const LOG_FUNCTION:String = "fn_log";
    7. public static const DEBUG: String = "debug";
    8. public static const VERBOSE:String = "verbose";
    9. public static const INFO: String = "info";
    10. public static const WARN: String = "warn";
    11. public static const ERROR: String = "error";
    12. public static function log(msg:String,level:String = LogUtil.INFO,tag:String = "AIR应用"):void{
    13. if(! _extensionContext){
    14. _extensionContext = ExtensionContext.createExtensionContext(EXTENSION_ID,null);
    15. }
    16. _extensionContext.call(LOG_FUNCTION,msg,level,tag);
    17. }
    18. }
    19. }
    复制代码
    这里只是一个简单的功能的实现。真正的要用于产品中,还是要适当的加上初始化完毕的回调方法等操作(具体内容见后续文章)。
    2、java部分代码的编写
    创建一个android工程(其实创建一个普通java工程就行,只要最后可以打包成jar,只是我这里要用到android的api所以我只能创建成android工程了)。






    我这里创建的android工程。也叫ANE_log,你可以和我不一样。
    这里要注意的两点,
    1,注意钩上Mark this project as a library。这样,IDE会自动为我们打成jar包,我们后面就要这个jar。
    2,注意引入jar包FlashRuntimeExtensions.jar。在FB下面有,具体地址是{FB目录}\sdks\4.6.0\lib\android\FlashRuntimeExtensions.jar
    以下是我项目中的代码结构
    创建一个简单ANE
    三个类文件内容分别如下:
    LogExtension内容

    1. package randy.util.log;

    2. import com.adobe.fre.FREContext;
    3. import com.adobe.fre.FREExtension;

    4. public class LogExtension implements FREExtension {
    5. private LogContext logContext = null;

    6.     public FREContext createContext(String arg0) {
    7.     if(logContext == null){
    8.         logContext = new LogContext();
    9.         }
    10.        return logContext;
    11.     }

    12.     public void dispose() {}

    13.     public void initialize() {}


    14. }
    复制代码
    LogContext内容:
    1. package randy.util.log;

    2. import java.util.HashMap;
    3. import java.util.Map;

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

    6. public class LogContext extends FREContext {

    7.     private static Map<String, FREFunction> functions = null;
    8.    
    9.     @Override
    10.     public void dispose() {}

    11.     @Override
    12.     public Map<String, FREFunction> getFunctions() {
    13.     if(functions == null){
    14.     functions = new HashMap<String, FREFunction>();
    15.     functions.put(LogFunction.FUNCTION_KEY, new LogFunction());
    16.     }
    17.        return functions;
    18.     }

    19. }
    复制代码
    LogFunction内容:
    1. package randy.util.log;

    2. import android.util.Log;

    3. import com.adobe.fre.FREContext;
    4. import com.adobe.fre.FREFunction;
    5. import com.adobe.fre.FREObject;

    6. public class LogFunction implements FREFunction {
    7. public static final String FUNCTION_KEY = "fn_log";

    8.     public FREObject call(FREContext arg0, FREObject[] arg1) {
    9.        try{
    10.       String msg =  arg1[0].getAsString();
    11.       String level =  arg1[1].getAsString();
    12.       String tag =  arg1[2].getAsString();

    13.       if("debug".equals(level)){
    14.       Log.d(tag, msg);
    15.       }else if("verbose".equals(level)){
    16.       Log.v(tag, msg);
    17.       }else if("info".equals(level)){
    18.       Log.i(tag, msg);
    19.       }else if("warn".equals(level)){
    20.       Log.w(tag, msg);
    21.       }else if("error".equals(level)){
    22.       Log.e(tag, msg);
    23.       }
    24.        }catch (Exception e) { }
    25.       
    26.        return null;
    27.     }

    28. }
    复制代码
    3,打包ANE
    代码过程全已经完毕了。现在我们进入打包阶段
    随便在你的硬盘上哪个位置创建一个log目录(我直接是在C盘下建的),内部结构如下。




    其中还有一个Android-ARM子目录。
    ANE_log.swc就是as部分代码创建的FLEX库项目生成的。
    子目录中,aneLog.jar(我的android工程原来生成的jar名为ane_log.jar,因为在extension.xml中,文本节点不能有下划下"_",所以我改了个名。包括上面的id值也只是采用跎峰形式的命名),可以在你的android项目中有一个bin目录,里面有一个jar包,就是他啦。
    至于catalog.xml和library.swf,你把上层目录中的ANE_log.swc拷进来。改成zip拓展名,解压就得到这两个文件。
    最后一个就是extension.xml了。
    xml内容如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <extension xmlns="http://ns.adobe.com/air/extension/3.4">
    3.   <id>randyUtilLog</id>
    4.   <versionNumber>1</versionNumber>
    5.   <platforms>
    6.     <platform name="Android-ARM">
    7.       <applicationDeployment>
    8.         <nativeLibrary>aneLog.jar</nativeLibrary>
    9.         <initializer>randy.util.log.LogExtension</initializer>
    10.       </applicationDeployment>
    11.     </platform>
    12.   </platforms>
    13. </extension>
    复制代码
    现有我们用这个命令来打包。
    1. adt -package -target ane log.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM
    复制代码
    这个adt就在你的FB下的SDK里的bin中。你可以将这个目录加到你的path里,或者命令中带上完整的路径。
    OK了,我得到我的ANE了,log.ane。
    4、使用ANE
    现在我要创建一个ActionScript手机项目来使用一下我刚才创建的ANE了。




    创建项目一直点下一步,到最后一步的时候,注意点到本地拓展选项卡,增加刚才创建的ANE。钩上 更新AIR应用程序描述符。IDE将会自动为你在应用程序描述符最后加上类似这样的ANE使用声明。



    不过。IDE引用ANE,也不是完全智能的。现在我引用的是log.ane。可能我下次修改ANE程序内容了,打成成log_v2.ane再改成引入log_v2.ane,有可能编译air程序的时候会报错,说找不到java类。可以自己手动进.actionScriptProperties。搜索比如log.ane。修改成现在的名字log_v2.ane。发现IDE没有及时更新到这个.actionScriptProperties文件才导致这个问题的。
    我的测试的AIR工程的主类内容如下


    1. package{
    2. import flash.display.Sprite;
    3. import flash.display.StageAlign;
    4. import flash.display.StageScaleMode;
    5. import flash.events.MouseEvent;
    6. import randy.util.log.LogUtil;
    7. public class TestLogAne extends Sprite{
    8. public function TestLogAne(){
    9. super();
    10. stage.align = StageAlign.TOP_LEFT;
    11. stage.scaleMode = StageScaleMode.NO_SCALE;
    12. stage.addEventListener(MouseEvent.CLICK,function(mouseEvent:MouseEvent):void{
    13. LogUtil.log("打印一条VERBOSE日志",LogUtil.VERBOSE);
    14. LogUtil.log("打印一条INFO日志",LogUtil.INFO);
    15. LogUtil.log("打印一条DEBUG日志",LogUtil.DEBUG);
    16. LogUtil.log("打印一条WARN日志",LogUtil.WARN);
    17. LogUtil.log("打印一条ERROR日志",LogUtil.ERROR);
    18. });
    19. }
    20. }
    21. }
    复制代码
    OK,打包安装(和普通air程序打包一样了)。运行起来。在白色的屏幕上随意点一下
    logcat看到日志啦。




    只是信息内容不完整。暂告一段落。

    本文来自:http://blog.sina.com.cn/s/blog_5d323f950101d4a4.html


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
    收藏收藏 分享分享 支持支持 反对反对 微信
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2026-1-25 17:56 , Processed in 0.056460 second(s), 35 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表