Android開發 Flash Ane創建和使用

Adobe AIR Native Extension,Adobe AIR的本地擴展,簡稱ANE。本來已經是過時的技術了,但是由於項目需求,需要使用 flash ane,在一番掙扎之後總算是成功編寫了 ane 並且實現了需要的功能,這裏記錄下來,以免這種古老的技術流失。

由於工作保密性,這裏只以一個簡單例子來呈現flash ane的編寫和使用。

一、創建 Android 本地程序 jar 包

1.創建android工程

首先是開發工具,我們需要用到的工具是 Flash Builder 和 Eclipse 

這裏推薦使用Eclipse來創建Android工程,因爲使用Android Studio創建工程,最後在導出jar包等地方會有問題。至於Eclipse怎麼配置Android開發環境,請自行百度,教程很多。不過在配置Android開發環境時,會因爲網上Android SDK的版本不夠老(因爲新的SDK已經不支持Eclipse了,google很任性~),導致環境配置失敗。如需老的SDK,可以在下方留言。

我們先在Eclipse中創建一個名爲 HelloAne 的Android工程,並且不創建Activity和launcher icon:

 

 接下來導入FlashRuntimeExtensions.jar。該jar包可以在Flash Builder的安裝路徑下找到:..\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0\lib\android 。找到後,將jar包拷貝到新建的Android工程的 ..\HelloAne\libs 路徑下。操作完的文件目錄結構如下:

接下來實現 FREExtension (Implements)、FREContext (extends)和 FREFunction (Implements)。

2.創建Function

我們創建一個 ToastFunction 的類,並且指定包名是:com.helloapp.ane.function。然後編寫如下代碼:

package com.helloapp.ane.function;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREInvalidObjectException;
import com.adobe.fre.FREObject;
import com.adobe.fre.FRETypeMismatchException;
import com.adobe.fre.FREWrongThreadException;

import android.widget.Toast;

public class ToastFunction implements FREFunction {

	@Override
	public FREObject call(FREContext context, FREObject[] objectAry) {
		// TODO Auto-generated method stub
		FREObject result = null;
		try {
			
			String msg = objectAry[0].getAsString();
			Toast.makeText(context.getActivity(), msg, Toast.LENGTH_SHORT).show();
			
			// 返回值
			result = FREObject.newObject(msg);
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FRETypeMismatchException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FREInvalidObjectException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FREWrongThreadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return result;
	}

}

call方法是最終調用到Android native的地方,第一個參數context是Android native的接口類對象,第二個參數objectAry是從Flex手機項目(AS3)傳過來的參數數組。例子中接收了一個String類型的msg參數,並顯示在手機上。如果需要返回值,可以通過

result = FREObject.newObject(msg);

設置返回值並返回給Flex項目。

創建NativeContext

我們在包路徑:com.helloapp.ane.context;下創建一個名爲 HelloAppContext的java 類,目的是返回一個存放本地方法的Map。具體代碼如下:

package com.helloapp.ane.context;

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

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.helloapp.ane.function.ToastFunction;

public class HelloAppContext extends FREContext {
	
	private static final String TOAST_FUNC_KEY = "toast";

	@Override
	public void dispose() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Map<String, FREFunction> getFunctions() {
		// TODO Auto-generated method stub
		Map<String,FREFunction> functions = new HashMap<String, FREFunction>();
		functions.put(TOAST_FUNC_KEY, new ToastFunction());
		return functions;
	}

}

創建NativeExtension

在包路徑:com.helloapp.ane.extension;下創建名爲 HelloAppExtension 的java類,該類負責與AS3 交互。具體代碼如下:

package com.helloapp.ane.extension;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
import com.helloapp.ane.context.HelloAppContext;

public class HelloAppExtension implements FREExtension {

	@Override
	public FREContext createContext(String arg0) {
		// TODO Auto-generated method stub
		return new HelloAppContext();
	}

	@Override
	public void dispose() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void initialize() {
		// TODO Auto-generated method stub
		
	}

}

這樣,我們的Android Native Lib就完成了。

導出 jar 包

鼠標選中src文件夾,右鍵——>Export——>Java——>JAR file——>Next:

設置jar包導出的路徑和名稱,然後點擊Finish即可導出jar包。

 

二、創建AS3 Lib

1.創建Flex庫項目

打開FlashBuilder,文件——>新建——>Flex 項目

2.創建AS類

src目錄,右鍵——>新建——>ActionScript類

3.實現接口類

通過ExtensionContext與Native交互。

com.example.myextension是一會新建extension.xml中要定義的一個ID,代表了android native extension,通過這個id得到extension的Context,之後調用call方法調用到Native層的Function,根據function_key找到對應的Function。
例如“toast”對應我們之前在android工程裏定義的ToastFunction。

package com.example.helloane
{
	import flash.external.ExtensionContext;
	
	public class AndroidToast
	{
		public var extCtx:ExtensionContext=null;
		
		public function AndroidToast()
		{
			extCtx = ExtensionContext.createExtensionContext("com.example.myextension","");
		}
		
		public function showToast(msg:String):void{
			if(extCtx){
				extCtx.call("toast",msg);
			}
		}

	}
}

4.創建extension.xml

在HelloAneFlex工程根目錄下創建一個名爲extension.xml的文件

並編輯如下:

<?xml version="1.0" encoding="UTF-8"?>
<extension xmlns="http://ns.adobe.com/air/extension/3.1">
    <id>com.example.myextension</id>
    <versionNumber>1</versionNumber>
    <platforms>
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>helloappane.jar</nativeLibrary>
                <initializer>com.helloapp.ane.extension.HelloAppExtension</initializer>
                <finalizer>com.example.helloane.AndroidToast</finalizer>
            </applicationDeployment>
        </platform>
    </platforms>
</extension>

編輯id:com.example.myextension 和AS類裏面使用的id一樣,實際上,是AS類使用的ID必須和這裏一樣

編輯nativeLibrary:最早導出的jar包:helloappane.jar

編輯initializer:在Android代碼中實現的Extension類的全稱:com.helloapp.ane.extension.HelloAppExtension

編輯finalizer:在Flex庫工程中實現的接口類的全稱:com.example.helloane.AndroidToast

5.設置打包目錄

創建一個文件夾makeane,把HelloAneFlex工程下的extension.xml文件和bin目錄下的HelloAneFlex.swc拷貝進去。再在makeane文件夾下新建一個名爲Android-ARM的文件夾,首先把之前打好的helloappane.jar拷貝到Android-ARM文件夾下,再把HelloAneFlex.swc拷貝出一個副本並重命名爲zip壓縮文件(或者其他壓縮文件),解壓之後,將裏面的所有文件拷貝到Android-ARM文件夾下。這樣我們就準備好了打包的所有文件:

6.打包生成ane

進入到makeane文件夾下,shift+右鍵,選擇“在此處打開命令窗口”進入到cmd界面。然後輸入以下命令:

"E:\軟件\AdobeFlashBuilder\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0\bin\adt" -package -target ane helloappane.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .

 其中雙引號裏是Flash Builder下的adt的路徑,注意改成自己的adt的路徑!

命令執行完,我們就能在當前文件夾下找到新生成的ANE:helloappane.ane

注意:

有文檔說要設置Action Script庫編譯器參數如下,所以最好設置一下:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章