【发布时间】: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