Android开发者的Ane简单入门——扩展XML文件不存在或者无效

来源:互联网 发布:微方摄像头软件 编辑:程序博客网 时间:2024/05/17 07:47

Android开发者的Ane简单入门——扩展XML文件不存在或者无效

一.Android native lib 

FlashRuntimeExtensions.jar位于FB的目录如下:

..\Adobe Flash Builder 4.6\sdks\4.6.0\lib\android\


1.新建Android工程min  SDK>=2.2(8)


2.去掉Create Activity的勾


3.导入FlashRuntimeExtensions.jar到libs下并build path

4.实现

  FREExtension (Implements)

  FREContext (extends)

  FREFunction (Implements)

  首先创建Function

ToastFunction

注意在第一次新建类的时候把包名填上


call方法是最终调用到Android native的地方,第二个参数是从Flex手机项目(AS3)传过来的参数数组

例如,如果传过来的第一个参数是String:


第一个参数可以获取Android运行的Context


最终的代码:

[java] view plaincopy
  1.   
[java] view plaincopy
  1. package com.example.anenativelib;  
  2.   
  3. import android.widget.Toast;  
  4.   
  5. import com.adobe.fre.FREContext;  
  6. import com.adobe.fre.FREFunction;  
  7. import com.adobe.fre.FREInvalidObjectException;  
  8. import com.adobe.fre.FREObject;  
  9. import com.adobe.fre.FRETypeMismatchException;  
  10. import com.adobe.fre.FREWrongThreadException;  
  11.   
  12. public class ToastFunction implements FREFunction {  
  13.   
  14.     @Override  
  15.     public FREObject call(FREContext context, FREObject[] params) {  
  16.         String msg = null;  
  17.         try {  
  18.              msg = params[0].getAsString();  
  19.         } catch (IllegalStateException e) {  
  20.             e.printStackTrace();  
  21.         } catch (FRETypeMismatchException e) {  
  22.             e.printStackTrace();  
  23.         } catch (FREInvalidObjectException e) {  
  24.             e.printStackTrace();  
  25.         } catch (FREWrongThreadException e) {  
  26.             e.printStackTrace();  
  27.         }  
  28.           
  29.         Toast.makeText(context.getActivity(), msg, Toast.LENGTH_SHORT).show();  
  30.           
  31.         return null;  
  32.     }  
  33.   
  34. }  

创建NativeContext

目的是返回一个存放本地方法的Map
[java] view plaincopy
  1. package com.example.anenativelib;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5. import com.adobe.fre.FREContext;  
  6. import com.adobe.fre.FREFunction;  
  7.   
  8. public class NativeContext extends FREContext {  
  9.     private static final String TOAST_FUNC_KEY = "toast";  
  10.     @Override  
  11.     public void dispose() {  
  12.   
  13.     }  
  14.   
  15.     @Override  
  16.     public Map<String, FREFunction> getFunctions() {  
  17.         Map<String,FREFunction> functions = new HashMap<String, FREFunction>();  
  18.         functions.put(TOAST_FUNC_KEY, new ToastFunction());  
  19.         return functions;  
  20.     }  
  21.   
  22. }  

创建NativeExtension

该类负责与AS3 交互
主要修改的地方是createContext方法返回之前创建的NativeContext
[java] view plaincopy
  1. package com.example.anenativelib;  
  2.   
  3. import com.adobe.fre.FREContext;  
  4. import com.adobe.fre.FREExtension;  
  5.   
  6. public class NativeExtension implements FREExtension {  
  7.   
  8.     @Override  
  9.     public FREContext createContext(String arg0) {  
  10.         return new NativeContext();  
  11.     }  
  12.   
  13.     @Override  
  14.     public void dispose() {  
  15.   
  16.     }  
  17.   
  18.     @Override  
  19.     public void initialize() {  
  20.   
  21.     }  
  22.   
  23. }  

到这里Android Native Lib就完成了
右键工程,导出(Export),Java下的Jar文件
选择导出目标,即导出的路径
得到Jar包,完成第一步。

二.AS3 Lib

1.文件,新建,Flex库项目





2.新建AS类




3.实现

通过ExtensionContext与Native交互
com.example.myextension是一会新建extension.xml中要定义的一个ID,代表了android native extension
通过这个id得到extension的Context
之后调用call方法调用到Native层的Function
根据function_key找到对应的Function
例如toast对应我们之前定义的ToastFunction

[java] view plaincopy
  1. package com.example.aslib  
  2. {  
  3.     import flash.external.ExtensionContext;  
  4.   
  5.     public class AndroidToast  
  6.     {  
  7.         public var extCtx:ExtensionContext=null;  
  8.           
  9.         public function AndroidToast()  
  10.         {  
  11.             extCtx = ExtensionContext.createExtensionContext("com.example.myextension","");  
  12.         }  
  13.           
  14.         public function showToast(msg:String):void{  
  15.             if(extCtx){  
  16.                 extCtx.call("toast",msg);  
  17.             }  
  18.         }  
  19.     }  
  20. }  

4.创建extension.xml

在ASlib下创建一个文件命名为extension.xml
编辑id:com.example.myextension 和AS类里面使用的id一样,实际上,是AS类使用的ID必须和这里一样
编辑nativeLibrary:最早导出的jar包:nativelib.jar
编辑initializer:在Android代码中实现的Extension类的全称:com.example.anenativelib.NativeExtension
[java] view plaincopy
  1. <extension xmlns="http://ns.adobe.com/air/extension/3.1">  
  2.       <id>com.example.myextension</id>  
  3.       <versionNumber>1</versionNumber>  
  4.       <platforms>  
  5.         <platform name="Android-ARM">  
  6.           <applicationDeployment>  
  7.             <nativeLibrary>nativelib.jar</nativeLibrary>  
  8.             <initializer>com.example.anenativelib.NativeExtension</initializer>  
  9.           </applicationDeployment>  
  10.         </platform>  
  11.       </platforms>  
  12. </extension>  

到这里,我们得到3个文件:
nativelib.jar
extension.xml
在Flex库项目下的bin目录还有:
ASlib.swc

5.设置打包目录

随便到一个目录下,新建一个文件夹,把这三个文件拷贝过来:


把ASlib.swc后缀名改为zip并解压得到两个文件,并新建Android-ARM文件夹:

最后把ASlib后缀名改回来
将jar包和library.swf拷贝到Android-ARM内:

6.设置环境变量

在以下目录
....\Adobe Flash Builder 4.6\sdks\4.6.0\bin
有一个文件adt.bat
因此把FB的安装路径下的
....\Adobe Flash Builder 4.6\sdks\4.6.0\bin添加到环境变量中

7.打包生成ane

回到之前的打包目录
shift+右键,选择“在此处打开命令窗口”进入到cmd界面
输入命令:(注意最后一个点不要漏掉,每个文章都有提到过)
adt -package -target ane myane.ane .\extension.xml -swc .\ASL
ib.swc -platform Android-ARM -C .\Android-ARM .


回车后在该目录下生成 myane.ane文件
到这里ane文件就打包完成了。

在这里有一个很重要的问题要提一下:
extension.xml不可以有任何注释,不然后面使用的时候会出现问题(XML文件不存在或者无效),导致了Flex手机项目找不到ASlib的类。(这是浪费我两天时间的罪魁祸首之一!!学习新东西就是各种细节问题)

三.Flex手机项目测试Ane

这里用上一篇文章《Android开发者的Air For Android简单入门》的Flex手机项目来测试

1.右键工程,属性--Flex构建路径--本机扩展--添加Ane:出现红叉不要紧


2.接着点击Flex构建打包,选中google Android再在右边选中本机扩展



3.最右边“”下有个CheckBox,看到了没有,赶紧点上(这是我卡了两天的罪魁祸首第一名!!)

打钩后,应用,确定

4.进入HelloFlexView.mxml 调用ane


5.运行



四.我遇到的几个问题

1.ane打包没有问题,但就是在调用的时候出现VerifyError #1014 Class .....could not found

原因:上面三.4的步骤,没有打钩

2.打不上钩,XML文件不存在或者无效

原因:extension.xml文件有注释
转:http://blog.csdn.net/u012146107/article/details/15813057
0 0
原创粉丝点击