守望者--AIR技术交流

标题: 创建一个简单ANE [打印本页]

作者: 破晓    时间: 2014-12-29 23:07
标题: 创建一个简单ANE
在这里记录一下创建一个简单功能的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,你也可以自己试试不钩上。


[attach]38[/attach]

在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工程了)。


[attach]39[/attach]

[attach]40[/attach]

我这里创建的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盘下建的),内部结构如下。


[attach]41[/attach]

其中还有一个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了。


[attach]42[/attach]

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

[attach]43[/attach]

不过。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看到日志啦。


[attach]44[/attach]

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

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







欢迎光临 守望者--AIR技术交流 (http://www.airmyth.com/)