OS X的Air Native Extension。扩展上下文没有名称的方法

时间:2015-01-20 15:55:46

标签: objective-c macos actionscript-3 air air-native-extension

所以,我建立了ANE,但似乎,我的ojective-c部分不起作用。 我尝试从本机代码调用函数,并得到错误:

The extension context does not have a method with the name someFunction.

我该怎么办?

这里是objective-c代码:

FREContext AirContext = nil;

FREObject init(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
    return nil;
}

FREObject someFunction(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
    FREDispatchStatusEventAsync(AirContext ,(uint8_t*) "SOME_EVENT", (uint8_t*) "some information" );
    return nil;
}

void ANEContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet)
{
    NSLog(@"Entering ContextInitinalizer()");
    *numFunctionsToTest = 5;

    FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * *numFunctionsToTest);

    func[0].name = (const uint8_t*) "init";
    func[0].functionData = NULL;
    func[0].function = &init;

    func[1].name = (const uint8_t*) "someFunction";
    func[1].functionData = NULL;
    func[1].function = &someFunction;

    // other blank functions

    *functionsToSet = func;

    AirContext = ctx;

    FREDispatchStatusEventAsync(AirContext ,(uint8_t*) "SOME_EVENT", (uint8_t*) "some information" );
}

void ContextFinalizer(FREContext ctx) {
    NSLog(@"Entering ContextFinalizer()");

    NSLog(@"Exiting ContextFinalizer()");
}

void ANEInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet )
{

    NSLog(@"Entering ExtInitializer()");

    *extDataToSet = NULL;
    *ctxInitializerToSet = &ContextInitializer;
    *ctxFinalizerToSet = &ContextFinalizer;

    NSLog(@"Exiting ExtInitializer()"); 
}

void ANEFinalizer(void* extData)
{
    return;
}

这里是我的as3代码:

public class MyANE extends EventDispatcher{
    private static var _instance:MyANE;

    private var extCtx:ExtensionContext;

    public function MyANE()
    {
        if (!_instance)
        {
            if (this.isSupported)
            {
                extCtx = ExtensionContext.createExtensionContext("my.awesome.ane", null);
                if (extCtx != null)
                {
                    trace('context is okay'); //this trace works
                    extCtx.addEventListener(StatusEvent.STATUS, onStatus);
                    extСtx.call("SomeFunction");
                } else
                {
                    trace('context is null.');
                }
            }
        _instance = this;
        }
        else
        {
            throw Error('singleton');
        }
    }

public static function getInstance():MyANE
    {
        return _instance != null ? _instance : new MyANE();
    }

public function get isSupported():Boolean
    {
        var value:Boolean = Capabilities.manufacturer.indexOf('Macintosh') > -1;
        trace(value ? 'supported' : 'not supported ');
        return value;
    }

private function onStatus(event:StatusEvent):void
    {
        trace('Event', event, 'code', event.code, 'level', event.level); //this traсе does not works
    }

这是我的.xml文件,我用它来构建ANE:

<extension xmlns="http://ns.adobe.com/air/extension/3.9">
    <id>my.awesome.ane</id>
    <versionNumber>1.0.0</versionNumber>
    <platforms>
        <platform name="MacOS-x86">
            <applicationDeployment>
                <nativeLibrary>MyANE.framework</nativeLibrary>
                <initializer>ANEInitializer</initializer>
                <finalizer>ANEFinalizer</finalizer>
            </applicationDeployment>
        </platform>
    </platforms>
</extension>

这个脚本我用于构建ANE:

mv ../as3/bin/MyANE.swc .
unzip MyANE.swc
mv library.swf mac/
rm catalog.xml
rsync -a ../Obective-C/ANE/Build/Products/Debug/ANE.framework/ mac/ANE.framework/
adt -package -target ane MyANE.ane extension.xml -swc MyANE.swc -platform MacOS-x86 -C mac .
mv MyANE.ane ~/Work/_Projects/test/libs-ane/

OS X的ANE,使用:

  • AIR 16;
  • Flex 4.6.0;
  • XCode 6.1.1;
  • Flash Builder 4.6;
  • Mac OS X Yosemite(10.10.1)。

2 个答案:

答案 0 :(得分:0)

您可以将objc中的函数定义为

func[1].name = (const uint8_t*) "someFunction";

但是从动作脚本中调用它,如

extСtx.call("SomeFunction");

可能是一个错字?

答案 1 :(得分:0)

您必须在AS3接口上定义该功能:

    public function someFunction():void{
        context.call("someFunction");
    }

同样在ObjetiveC方面你宣布5个功能,而你只是定义2,改变这个:

 *numFunctionsToTest = 5;

到这个

  *numFunctionsToTest = 2; 

即使这不会导致错误