开发Flex for Android第一个ANE(ActionScript Native Extensions)本地扩展

本地扩展就是需要调用原生的东西要开发的插件

首先打开Android Studio,建个空项目, 再建立个名为 FirstANE 的Android Library Module,

然后把C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\lib\android\FlashRuntimeExtensions.jar

文件复制放到新建模块的libs文件夹下

接着建上3个类,代码如下:

package org.fluidea;

import java.util.HashMap;
import java.util.Map;

import android.util.Log;

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

public class FirstANEContext extends FREContext
{
	
	@Override 
    public void dispose() { 
        Log.i("FirstANEContext", "Dispose context"); 
    } 
 
    @Override 
    public Map<String, FREFunction> getFunctions() { 
        Log.i("FirstANEContext", "Creating function Map"); 
        Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>(); 
 
        functionMap.put("sayHello", new SayHelloFunction() ); 
        return functionMap;
    } 
}


package org.fluidea;

import android.util.Log;

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

public class FirstANEExtension implements FREExtension {

	private FirstANEContext context;
	
	private String tag = "FirstANEExtension";
	
	@Override
	public FREContext createContext(String arg0) {
		 Log.i(tag, "Creating context"); 
	     if( context == null) context = new FirstANEContext(); 
	     return context; 
	}

	@Override
	public void dispose() {
		Log.i(tag, "dispose");
	}

	@Override
	public void initialize() {
		Log.i(tag, "initialize");
	}

}

package org.fluidea;

import android.util.Log;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;

public class SayHelloFunction implements FREFunction {

	@Override
	public FREObject call(FREContext arg0, FREObject[] arg1) {
		
		FREObject result = null;

		Log.i ("SayHelloFunction", "call");

		try {

			FREObject msg = arg1[0];

			String s = msg.getAsString();

			Log.i("SayHelloFunction", "String from AS: " + s);
			
			result = FREObject.newObject("Response from Java:" + s);
		}

		catch (Exception e) {

			Log.i ("SayHelloFunction", e.getMessage());
		}

		return result;
	}

}

接着用上一节介绍的gradle打包jar的方法, 打包成 FirstANE.jar 包

然后到 MyEclipse 里面, 新建一个Flex 库项目名为 FirstANE ,建立一个as类, 代码如下

package org.fluidea 
{
	
	import flash.external.ExtensionContext;
	
	public class FirstANE 
	{
		
		private var context:ExtensionContext;
		
		public function FirstANE() 
		{
			try
			{
				context = ExtensionContext.createExtensionContext("org.fluidea.FirstANE", null);
			}catch (e:Error)
			{
				trace("e:" + e);
			}
		}
		
		public function isSupported():Boolean
		{
			return context != null;
		}
		
		public function sayHello(message:String):String
		{
			var retval:String;
			retval = context.call("sayHello", message) as String;
			return retval;
		}
		
		public function dispose():void
		{
			context.dispose();
		}
		
	}

}

自动构建或手动构建得到bin目录下的 FirstANE.swc 文件

然后打包, 我假设已经把 C:\Users\Administrator\AppData\Local\Android\sdk\tools加到环境变量了

我们建个文件夹叫pkg, 现在有 FirstANE.jar 和 FirstANE.swc 2个文件,

FirstANE.swc直接放在 pkg 文件夹下,

在 pkg 里面再建个文件夹叫 libs , 把FirstANE.jar放进去, 把 FirstANE.swc 用解压工具把里面的 library.swf 解压出来放到 libs 文件夹下

在 pkg 里再建个 extension.xml 文件

<extension xmlns="http://ns.adobe.com/air/extension/3.1">
  <id>org.fluidea.FirstANE</id>
  <versionNumber>1</versionNumber>
  <platforms>
    <platform name="Android-ARM">
      <applicationDeployment>
        <nativeLibrary>FirstANE.jar</nativeLibrary>
        <initializer>org.fluidea.FirstANEExtension</initializer>
      </applicationDeployment>
    </platform>
  </platforms>
</extension>


在 pkg 里再建个 pkg_ane.bat 文件 

adt -package -target ane FirstANE.ane extension.xml -swc FirstANE.swc -platform Android-ARM -C libs .

pause

注意这是3行 , 然后双击运行就可以在 pkg 里打包出 FirstANE.ane 文件了

继续建立一个 Flex 手机项目(我建立ActionScript 手机项目MyEclipse会卡死), 选支持Google Android的空白项目,

最后一步的本机扩展选择我们的FirstANE.ane文件, OK

再新建一个 ActionScript 类, MyANETest.as, 右键设置为默认应用程序

package
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	
	import org.fluidea.FirstANE;
	
	public class MyANETest extends Sprite
	{		
		private var ane:FirstANE
		
		public function MyANETest()
		{
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			
			ane = new FirstANE();
			// 判断是否可以运行
			if (ane.isSupported()) {
				// 调用 sayHello 并输出返回值
				trace(ane.sayHello("Hi, Android"));
			}
		}
		
	}
}

然后点调试配置, 

开发Flex for Android第一个ANE(ActionScript Native Extensions)本地扩展_第1张图片

然后悲剧的一幕肯定会上演, 后台无输出, 后台无输出, 后台无输出..........................

是不是哪里代码写错了, 没错呀, 我都看了几十次了这文章 : [安卓开发整理]——ANE, 没什么复杂的玩意儿呀

然后开始慢慢比对代码了, 接着看是不是资源文件没打进去导致的, 最后还在MyEclipse新建一个java项目把jar包引用进去, 看 jar 包对不

把想到的可能都试了一遍, 最后下班了去吃饭, 中途就想了, 文件没错, 是不是打的 jar 包有问题, 结果就上网下载了个adt-bundle-windows-x86_64-20140702.zip

新建个 Android Project, 把代码贴进去, File -> Export -> ......., 最后打包ane, 引用到上面的 MyANETest , 终于盼到了控制台的输出 : 



完结, 这里是全部源码 .

          这里是 pkg 打包命令及资源

或者 https://github.com/svygh123/ANE_Relate.git

你可能感兴趣的:(开发Flex for Android第一个ANE(ActionScript Native Extensions)本地扩展)