android版
java端:新建一个项目,导入air SDK目录下lib/android/FlashRuntimeExtensions.jar包,之後创建以下三个文件:
package com.example;
import com.adobe.fre.FREExtension;
public class AneExtension implements FREExtension
{
@Override
public FREContext createContext(String name)
{
return new threeExtensionContext();
}
@Override
public void dispose()
{
}
@Override
public void initialize()
{
}
}
public class AneContext extends FREContext
{
@Override
public void dispose()
{
}
@Override
public Map<String, FREFunction> getFunctions()
{
Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
functionMap.put("testFunction", new testFunction());
return functionMap;
}
}
public class testFunction implements FREFunction
{
@Override
public FREObject call(FREContext context, FREObject[] args)
{
//todo
}
}
编译没有问题後,导出一个AneExample.jar文件,放到一个目录
AS端:
建立一个Flex Library项目,创建AS调用接口:
package com.example
{
import flash.external.ExtensionContext;
public class Associator
{
private var context : ExtensionContext;
public class Associator()
{
if(context == null)
context = ExtensionContext.createExtensionContext("com.example", ""); //第一个参数为后面extension.xml中的id
}
}
public function call():void
{
//todo
if(context)
context.call("testFunction", "args");
}
}
编译,生成bin目录下.swc文件, 将该swc文件到之前jar文件的目录,并复制一份,解压出来(解压不了可以将扩展名改为.zip後解压)
下一步,建议一个extension.xml文件,内容如下:
<extension xmlns="http://ns.adobe.com/air/extension/3.5"> //注意版本号,与air SDK相同
<id>com.example</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="Android-ARM">
<applicationDeployment>
<nativeLibrary>AneExample.jar</nativeLibrary>
<initializer>com.example.AneExtension</initializer>
<finalizer>com.example.AneExtension</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
下一步,就可以打包ane了,使用air SDK下的lib/adt.jar, 执行以下命令:
adt -package -target ane AneTest.ane extension.xml -swc Associator.swc -platform Android-ARM library.swf AneExample.jar
得到AneTest.ane文件,当然,名字是自己任意取的, 然後在AS的工程里的native extension里导入就可以了
ios版:
启动Xcode,创建一个Cocoa Touch Static Library的项目。
将air sdk下的FlashRuntimeExtensions.h添加到工程中
下面是.m文件的内容:
#import "FlashRuntimeExtensions.h"
#import <AudioToolbox/AudioServices.h>
//自定义的函数
FREObject VibrateDevice(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"Entering VibrateDevice()");
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
NSLog(@"Exiting VibrateDevice()");
return NULL;
}
//自定义的函数
FREObject IsSupported(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"Entering IsSupported()");
FREObject fo;
FRENewObjectFromBool(YES, &fo);
NSLog(@"Exiting IsSupported()");
return fo;
}
//自定义的函数,初始化调用
FREObject InitNativeCode(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"Entering InitNativeCode()");
//todo
NSLog(@"Exiting InitNativeCode()");
return NULL;
}
//实现的接口函数,创建extension context的实例时会调用
void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext 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*) "isSupported";
func[0].functionData = NULL;
func[0].function = &IsSupported;
func[1].name = (const uint8_t*) "vibrateDevice";
func[1].functionData = NULL;
func[1].function = &VibrateDevice;
//Just for consistency with Android
func[2].name = (const uint8_t*) "initNativeCode";
func[2].functionData = NULL;
func[2].function = &InitNativeCode;
*functionsToSet = func;
NSLog(@"Exiting ContextInitializer()");
}
//context对象析构时调用
void ContextFinalizer(FREContext ctx) {
NSLog(@"Entering ContextFinalizer()");
// Nothing to clean up.
NSLog(@"Exiting ContextFinalizer()");
return;
}
//AS第一次调用ExtensionContext.createExtensionContext()时,会调用该接口
void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet)
{
NSLog(@"Entering ExtInitializer()");
*extDataToSet = NULL;
*ctxInitializerToSet = &ContextInitializer;
*ctxFinalizerToSet = &ContextFinalizer;
NSLog(@"Exiting ExtInitializer()");
}
//AS释放Extension对象时调用此接口
void ExtFinalizer(void* extData)
{
NSLog(@"Entering ExtFinalizer()");
// Nothing to clean up.
NSLog(@"Exiting ExtFinalizer()");
return;
}
编译生成 libVibrationiOSLibrary.a文件
Extension.xml内容:
<extension xmlns="http://ns.adobe.com/air/extensin/2.7">
<id>com.adobe.Vibration</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="iphone-ARM">
<applicationDeployment>
<nativeLibrary>libVibrationiOSLibrary.a</nativeLibrary>
<initializer>ExtInitializer</initializer>
<finalizer>ExtFinalizer</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
打包ane命令:
java -jar adt.jar -package -target ane aneDemo.ane extension.xml -swc AneFlex.swc -platform iPhone-ARM library.swf libAneDemo.a