エアネイティブエクステンション「拡張コンテキストには名前のメソッドがありません」
-
27-10-2019 - |
質問
私はAir Native Extensionを作成しようとしており、すべてのコンポーネントのコンピレーションが成功した後、Flash Builder 4.6ログ「エラー#3500:拡張コンテキストには名前のメソッドがありません...」。
ネイティブ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();
}
}
}
この問題を解決するための支援をいただければ幸いです。
解決 5
私はこの問題を解決しました。別のANEプロジェクトを始めて、そこからどのように構築したかは完全にはわかりません。しかし、問題は、コードのActionScript部分と拡張記述子の間違ったパッケージ名に関係していたと思われます。
他のヒント
ここの前にご覧ください: http://forums.adobe.com/thread/923158
同じプロジェクト内に複数の拡張機能がある場合にこのエラーが発生した場合は、注意してください。すべての初期化の終了メソッドは、すべての拡張機能間で異なるユニークな名前を持つ必要があります。 NB。 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;
}
そして、ファイナルライザーについても同じです。
これが役立つことを願っています。
ANE間のシンボル名の競合を解決するには、AIR 3.4 IE Hideanelibsymbolsに新しいADTオプションがあります
参照: http://help.adobe.com/en_us/air/build/ws901d38e593cd1bac1e63e3d128cdca935b-8000.html
また、iOS用のANEの作成を開始するプロセスを容易にするために、Xcode ANEテンプレートを書きました。
参照: https://github.com/divijkumar/xcode-template-ane
開始する前に、github wikiページの指示を読んでください。
同じ問題がありましたが、コンクリートマシン(他の人はうまく機能します)で、DLLを再構築するまで何も役に立ちません フラグをリリースします. 。デバッグバージョンは、ユーザーPCにインストールされているいくつかの追加のdllを要求するようですので、リリースフラグを使用してビルドしてください!
C ++関数「GetString」には議論が必要だと思われます。だからあなたが電話しているとき _ExtensionContext.call("getString") as String;
C ++にはgetString()メソッドがありません。それはあなたにも議論を通過することを望んでいます。次のようにこれらを呼び出し方に追加します:
_ExtensionContext.call("getString", arg, arg1, arg2) as String;
渡す引数は、C ++ GetStringメソッドによって指定された適切なタイプのものでなければなりません。
参照を参照してください:http://help.adobe.com/en_us/flashplatform/reference/actionscript/3/flash/external/extensioncontext.html#call()
この質問は古いですが、確かな答えはありません。 Android Aneで同じ問題に遭遇しました。 Freextension機能/クラスで、あなた しなければならない Frecontextの新しいインスタンスを返し、その場合はFrecontextのインスタンスで、あなたは しなければならない 関数マップを返します。私は、地図を返さず、頭が何が起こっているのかを理解しようとして鶏肉のように走り回るという間違いを犯しました。うまくいけば、それが将来誰かを助けるでしょう。
私はこれと同じ問題を抱えていましたが、ここで他の答えはどれも私のためにそれを解決しませんでした。 BlackBerry Playbook用のシンプルなC ++ ANEを作成しようとしていましたが、実行しようとするたびにエラー#3500を取得しました。 Cではまったく正確に動作したのとまったく同じコードが正常に機能しました。C++コンパイラがメソッド名のマングリングを行っていたので、私が呼んでいたメソッドが見つかりませんでした。このように、extern "c"で関数定義を包むことで解決しました。
extern "C" {
void ExtensionInitializer(void** extDataToSet,
FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet);
void ExtensionFinalizer();
void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
uint32_t* numFunctionsToSet, const FRENamedFunction** functionsToSet);
void ContextFinalizer(FREContext ctx);
FREObject myMethod(FREContext ctx, void* functionData, uint32_t argc,
FREObject argv[]);
}