【问题标题】:Air Native Extension for OS X. The extension context does not have a method with the name适用于 OS X 的 Air Native Extension。扩展上下文没有名称为方法
【发布时间】:2015-01-20 15:55:46
【问题描述】:

所以,我构建了 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
    }

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

<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)。

【问题讨论】:

  • 你能检查一下Objective C层的上下文是否为空吗?
  • 这可能不起作用的原因有很多,主要与初始化过程有关。您需要包含更多代码,以向我们展示如何在本机和 as3 端创建上下文以及尝试在何处分派事件。
  • @ozmachine 我不知道,该怎么做。我试图创建输出文件,但似乎这段代码甚至没有执行。

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


【解决方案1】:

你在 objc 中定义函数为

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

但从动作脚本中调用它

extСtx.call("SomeFunction");

可能是笔误?

【讨论】:

    【解决方案2】:

    你必须在 AS3 接口上这样定义函数:

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

    同样在 ObjetiveC 方面,您声明了 5 个函数,而您只定义了 2 个函数,请更改:

     *numFunctionsToTest = 5;
    

    到这里

      *numFunctionsToTest = 2; 
    

    即使这不会导致错误

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 2015-12-13
      • 2011-12-24
      • 1970-01-01
      • 2012-02-17
      • 2014-08-26
      • 2014-04-03
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多