- 积分
- 136401
- 注册时间
- 2014-12-27
- 最后登录
- 2026-1-24
- 在线时间
- 605 小时
- 威望
- 562
- 贡献
- 29
- 金币
- 52903
- 钢镚
- 1422
- 交易凭证
- 1
- 分享
- 0
- 精华
- 33
- 帖子
- 2094
- 主题
- 1742
TA的每日心情 | 擦汗 2018-4-10 15:18 |
|---|
签到天数: 447 天 [LV.9]以坛为家II
超级版主
    
- 威望
- 562
- 贡献
- 29
- 金币
- 52903
- 钢镚
- 1422
 
|
在这里记录一下创建一个简单功能的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里创建包和类。
我的代码如下。
- package randy.util.log{
- import flash.external.ExtensionContext;
- public class LogUtil{
- private static var _extensionContext:ExtensionContext = null;
- private static const EXTENSION_ID:String = "randyUtilLog";
- private static const LOG_FUNCTION:String = "fn_log";
- public static const DEBUG: String = "debug";
- public static const VERBOSE:String = "verbose";
- public static const INFO: String = "info";
- public static const WARN: String = "warn";
- public static const ERROR: String = "error";
- public static function log(msg:String,level:String = LogUtil.INFO,tag:String = "AIR应用"):void{
- if(! _extensionContext){
- _extensionContext = ExtensionContext.createExtensionContext(EXTENSION_ID,null);
- }
- _extensionContext.call(LOG_FUNCTION,msg,level,tag);
- }
- }
- }
复制代码 这里只是一个简单的功能的实现。真正的要用于产品中,还是要适当的加上初始化完毕的回调方法等操作(具体内容见后续文章)。
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内容
- package randy.util.log;
- import com.adobe.fre.FREContext;
- import com.adobe.fre.FREExtension;
-
- public class LogExtension implements FREExtension {
- private LogContext logContext = null;
-
- public FREContext createContext(String arg0) {
- if(logContext == null){
- logContext = new LogContext();
- }
- return logContext;
- }
-
- public void dispose() {}
-
- public void initialize() {}
-
-
- }
复制代码 LogContext内容:
- package randy.util.log;
- import java.util.HashMap;
- import java.util.Map;
-
- import com.adobe.fre.FREContext;
- import com.adobe.fre.FREFunction;
-
- public class LogContext extends FREContext {
-
- private static Map<String, FREFunction> functions = null;
-
- @Override
- public void dispose() {}
-
- @Override
- public Map<String, FREFunction> getFunctions() {
- if(functions == null){
- functions = new HashMap<String, FREFunction>();
- functions.put(LogFunction.FUNCTION_KEY, new LogFunction());
- }
- return functions;
- }
-
- }
复制代码 LogFunction内容:
- package randy.util.log;
- import android.util.Log;
- import com.adobe.fre.FREContext;
- import com.adobe.fre.FREFunction;
- import com.adobe.fre.FREObject;
-
- public class LogFunction implements FREFunction {
- public static final String FUNCTION_KEY = "fn_log";
-
- public FREObject call(FREContext arg0, FREObject[] arg1) {
- try{
- String msg = arg1[0].getAsString();
- String level = arg1[1].getAsString();
- String tag = arg1[2].getAsString();
-
- if("debug".equals(level)){
- Log.d(tag, msg);
- }else if("verbose".equals(level)){
- Log.v(tag, msg);
- }else if("info".equals(level)){
- Log.i(tag, msg);
- }else if("warn".equals(level)){
- Log.w(tag, msg);
- }else if("error".equals(level)){
- Log.e(tag, msg);
- }
- }catch (Exception e) { }
-
- return null;
- }
-
- }
复制代码 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内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <extension xmlns="http://ns.adobe.com/air/extension/3.4">
- <id>randyUtilLog</id>
- <versionNumber>1</versionNumber>
- <platforms>
- <platform name="Android-ARM">
- <applicationDeployment>
- <nativeLibrary>aneLog.jar</nativeLibrary>
- <initializer>randy.util.log.LogExtension</initializer>
- </applicationDeployment>
- </platform>
- </platforms>
- </extension>
复制代码 现有我们用这个命令来打包。
- 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工程的主类内容如下
- package{
- import flash.display.Sprite;
- import flash.display.StageAlign;
- import flash.display.StageScaleMode;
- import flash.events.MouseEvent;
- import randy.util.log.LogUtil;
- public class TestLogAne extends Sprite{
- public function TestLogAne(){
- super();
- stage.align = StageAlign.TOP_LEFT;
- stage.scaleMode = StageScaleMode.NO_SCALE;
- stage.addEventListener(MouseEvent.CLICK,function(mouseEvent:MouseEvent):void{
- LogUtil.log("打印一条VERBOSE日志",LogUtil.VERBOSE);
- LogUtil.log("打印一条INFO日志",LogUtil.INFO);
- LogUtil.log("打印一条DEBUG日志",LogUtil.DEBUG);
- LogUtil.log("打印一条WARN日志",LogUtil.WARN);
- LogUtil.log("打印一条ERROR日志",LogUtil.ERROR);
- });
- }
- }
- }
复制代码 OK,打包安装(和普通air程序打包一样了)。运行起来。在白色的屏幕上随意点一下
logcat看到日志啦。
只是信息内容不完整。暂告一段落。
本文来自:http://blog.sina.com.cn/s/blog_5d323f950101d4a4.html
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|