所以,我建立了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,使用:
答案 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;
即使这不会导致错误