標籤:blog http 使用 檔案 os art
來源:http://blog.csdn.net/zu12jing/article/details/7331397
flash開發工具用的是flashdevelop(由於flashdevelop還能直接開啟flashbuilder工程,反過來就不知道了)
一.建立工程
建立一個ios的工程,這個網上很多資料我就不寫了
關鍵點:要打包到ios裝置上主要要看預設的AIR_IOS_readme.txt檔案說明,這樣對打包ios工程設定講的非常詳細
二.怎麼使用ane(ane封裝後面補上)
ane:包括了所有的所有跨平台所需要的資源
三、lib.a檔案產生(環境 xcode4.2)
1,啟動Xcode,在IOS-》Frameworkd&Library下面,建立一個Cocoa Touch Static Library的項目。
2,建立好之後,從你下載的flex SDK目錄下,找到Include檔案夾,找到裡面的FlashRuntimeExtensions.h添加到工程中
3,可以把系統預設產生.h檔案刪除,留一個.m的檔案就行了
4,下面是.m檔案的內容
#import "FlashRuntimeExtensions.h"
#import <AudioToolbox/AudioToolbox.h>
#import <UIKit/UIKit.h>
FREObject ShowIconBadageNumber(FREObject ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"entering in ShowIconBadageNumber()");
FREObject fo;
FRENewObjectFromBool(NO, &fo);
NSLog(@"entering in ShowIconBadageNumber()");
int32_t t;
FREGetObjectAsInt32(argv[0], &t);
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:t];
return argv[0];
}
FREObject ShowAlertInfo(FREObject ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"entering ShowAlertInfo()");
FREObject fo;
FRENewObjectFromBool(NO, &fo);
int32_t t;
FREGetObjectAsInt32(argv[0], &t);
NSString *tmpStr = [NSString stringWithFormat:@"%d", t];
UIAlertView *tmpAlert = nil;
tmpAlert = [[UIAlertView alloc] initWithTitle:@"系統資訊" message:tmpStr delegate:nil cancelButtonTitle:@"sure" otherButtonTitles: nil];
[tmpAlert show];
[tmpAlert release];
NSLog(@"Exiting ShowAlertInfo()");
return argv[0];
}
FREObject InitNativeCode(FREObject ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"Entering InitNativeCode()");
NSString *tmpStr = [NSString stringWithFormat:@"%d", 10000];
UIAlertView *tmpAlert = nil;
tmpAlert = [[UIAlertView alloc] initWithTitle:@"系統資訊" message:tmpStr delegate:nil cancelButtonTitle:@"sure" otherButtonTitles: nil];
[tmpAlert show];
[tmpAlert release];
// Nothing to do.
NSLog(@"Exiting InitNativeCode()");
return NULL;
}
void ContextInitializer(void* extData, const uint8_t* ctxType, FREObject ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet)
{
NSLog(@"entering contextInitializer");
*numFunctionsToTest = 3;
FRENamedFunction *func = (FRENamedFunction *)malloc(sizeof(FRENamedFunction) * 3);
func[0].name = (const uint8_t*)"InitNativeCode";
func[0].functionData = NULL;
func[0].function = &InitNativeCode;
func[1].name = (const uint8_t*)"ShowIconBadageNumber";
func[1].functionData = NULL;
func[1].function = &ShowIconBadageNumber;
func[2].name = (const uint8_t*)"ShowAlertInfo";
func[2].functionData = NULL;
func[2].function = &ShowAlertInfo;
*functionsToSet = func;
NSLog(@"exiting contextInitializer");
}
void ContextFinalizer(FREObject ctx)
{
NSLog(@"Entering ContextFinalizer()");
// Nothing to clean up.
NSLog(@"Exiting ContextFinalizer()");
}
void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet)
{
NSLog(@"Entering ExtInitializer()");
*extDataToSet = NULL;
*ctxInitializerToSet = &ContextInitializer;
*ctxFinalizerToSet = &ContextFinalizer;
NSLog(@"Exiting ExtInitializer()");
}
void ExtFinalizer(void *extData)
{
NSLog(@"Entering ExtFinalizer()");
// Nothing to clean up.
NSLog(@"Exiting ExtFinalizer()");
return;
}
前面兩個函數是自己寫的借口,後面是通用的借口,在紅色標記的函數裡記得要開闢你所寫介面的數量,我就是少了一個一直調用介面函數失敗,在工程設定裡記得將Enable linking with shared libraried設定成NO,現在就可以生產.a檔案了
四.生產.swc介面檔案(flash builder4.6)
建立flex庫項目,點擊工程屬性,flex庫構建路徑-》資源,選擇src確定,swc就生產了,下面是代碼(註:有時候由於flex版本問題要在flex庫編譯器選項卡的附加編譯器參數你加入-swf-version 13)
package com.coolexp
{
import flash.external.ExtensionContext;
public class aneFlex
{
private static var extContext:ExtensionContext = null;
public function aneFlex()
{
showBadageNum(100);
}
public static function showBadageNum(num:int):int
{
if(!extContext)
{
initExtension();
}
return int(extContext.call("ShowIconBadageNumber", num));
}
public static function showAlertInfo(num:int):int
{
if(!extContext)
{
initExtension();
}
return int(extContext.call("ShowAlertInfo", num));
}
public static function initExtension():void
{
trace("vibration constructor: create an extension context");
extContext = ExtensionContext.createExtensionContext("com.coolexp.aneFlex", "");
extContext.call("InitNativeCode");
extContext.call("ShowAlertInfo", 20);
}
}
}
五、打包.ane檔案
將產生的.a和.swc檔案拷貝到同一個目錄下,複製一份.swc檔案將尾碼名改成.zip解壓將裡面的兩個檔案拷貝出來放於.a檔案同一檔案夾(就是這個目錄下目前有四個檔案.a,.swc,.swf,.xml),建立一個extension.xml檔案(內容如下),com.coolexp.aneFlex這個id要和flex 庫工程的id一樣,libAneDemo.a是你產生.a檔案的名字。然後找到你flex庫中adt檔案位置執行下面藍色命令打包就成
<extension xmlns="http://ns.adobe.com/air/extensin/2.7">
<id>com.coolexp.aneFlex</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="iphone-ARM">
<applicationDeployment>
<nativeLibrary>libAneDemo.a</nativeLibrary>
<initializer>ExtInitializer</initializer>
<finalizer>ExtFinalizer</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
打包.ane命令
"D:\flex sdk\4.6.0\bin\adt" -package -target ane aneDemo.ane extension.xml -swc AneFlex.swc -platform iPhone-ARM library.swf libAneDemo.a
這樣在檔案夾下就會產生一個aneDemo.ane檔案了
六,調用.ane(flashdevelop 工程)
複製ane檔案到lib目錄下,添加到庫並設定成外部應用庫。在packager.bat中加入-extdir lib/
例:call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR%-extdir lib/
由於是extdir lib目錄所以要把.ane檔案放入lib檔案夾下
在as3工程屬性設定中的extensions選項卡中加入com.coolexp.aneFlex id
這個在你的as3工程裡就能調用.ane的庫,實現後才發現不能聯機編譯的,直接生產.ipa封裝到ipad上成功運行
注意:要產生.apk或者.ipa包的時候才能用.ane,不然在模擬器上嵌入ane會認不到ane裡面配置的id,編譯會報錯