我正在尝试创建一个AIR Native扩展,在成功编译所有组件后,Flash Builder 4.6会记录"Error #3500: The Extension context‘s not a method with the name.“。
下面是本机DLL的C++代码:
#include "stdafx.h"
#include "TestANE.h"
#include "FlashRuntimeExtensions.h"
#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
FREObject isSupported(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
FREObject result;
uint32_t isSupportedSwitch = 1;
FRENewObjectFromBool(isSupportedSwitch, &result);
return result;
}
FREObject getString(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
FREObject result;
const char *testString = "Hello World from C++!";
FRENewObjectFromUTF8(strlen(testString)+1, (const uint8_t *) testString, &result);
return result;
}
void taneContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions) {
*numFunctions = 2;
FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));
func[0].name = (const uint8_t*) "isSupported";
func[0].functionData = NULL;
func[0].function = &isSupported;
func[1].name = (const uint8_t*) "getString";
func[1].functionData = NULL;
func[1].function = &getString;
*functions = func;
}
void taneContextFinalizer(FREContext ctx) {
return;
}
void taneInitializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer) {
*ctxInitializer = &taneContextInitializer;
*ctxFinalizer = &taneContextFinalizer;
}
void taneFinalizer(void* extData) {
return;
}以下是ActionScript 3接口的代码:
package com.tests.TestANE {
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.external.ExtensionContext;
public class TestANE extends EventDispatcher {
private var _ExtensionContext:ExtensionContext;
public function TestANE(target:IEventDispatcher=null) {
this._ExtensionContext = ExtensionContext.createExtensionContext("com.tests.TestANE", null);
super(target);
}
public function isSupported():Boolean {
return _ExtensionContext.call("isSupported") as Boolean;
}
public function getString():String {
return _ExtensionContext.call("getString") as String;
}
public function dispose():void {
this._ExtensionContext.dispose();
}
}
}任何帮助解决这个问题的人都将不胜感激。
发布于 2011-12-07 04:50:18
我已经解决了这个问题。我不是完全确定,因为我开始了另一个项目,并从那里建立。然而,我怀疑问题与代码的ActionScript部分和扩展描述符中错误的包名有关。
发布于 2012-09-06 19:49:47
请在这里之前查看:http://forums.adobe.com/thread/923158
如果在同一项目中有多个扩展时出现此错误,请小心:每个初始化器结束终结器方法在所有扩展之间必须具有不同且唯一的名称。注意:不仅是在extension.xml中指定的方法,还包括您延迟以初始化上下文的方法。需要明确的是:不仅扩展初始化器,而且项目内的上下文初始化器在所有扩展之间都必须有唯一的名称。
例如:
void UNIQUE_NAME_ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet) {
NSLog(@"Entering ExtInitializer()");
*extDataToSet = NULL;
*ctxInitializerToSet = &UNIQUE_NAME_ContextInitializer;
*ctxFinalizerToSet = &UNIQUE_NAME_ContextFinalizer;
NSLog(@"Exiting ExtInitializer()");
}
void UNIQUE_NAME_ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet)
{
*numFunctionsToTest = 1;
FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 1);
func[0].name = (const uint8_t*) "scan";
func[0].functionData = NULL;
func[0].function = &scan;
*functionsToSet = func;
}终结器也是如此。
我希望这能帮到你。
发布于 2012-09-07 15:08:54
为了解决ANE之间的符号名称冲突,在AIR 3.4中增加了一个新的ADT选项,即hideANELibSymbols
参考:http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html
此外,为了简化为iOS编写an的入门过程,我编写了一个xcode和模板。
参考:https://github.com/divijkumar/xcode-template-ane
在开始之前,一定要阅读github维基页面上的说明。
https://stackoverflow.com/questions/8360591
复制相似问题