1

AIR ネイティブ拡張を作成しようとしていますが、すべてのコンポーネントのコンパイルが成功した後、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();
        }
    }
}

この問題を解決するための助けをいただければ幸いです。

4

7 に答える 7

2

ここの前を参照してください: 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-06T11:49:47.023 に答える
1

ANE 間のシンボル名の競合を解決するために、AIR 3.4 には新しい ADT オプション、つまり hideANELibSymbols があります。

参照: http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html

また、iOS 用の ANE の作成を開始するプロセスを容易にするために、xcode ANE テンプレートを作成しました。

参照: https://github.com/divijkumar/xcode-template-ane

開始する前に、github wiki ページの説明をお読みください。

于 2012-09-07T07:08:53.550 に答える
0

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

于 2011-12-02T18:41:02.890 に答える
0

この質問は古いですが、確かな答えはありません。Android ANE で同じ問題に遭遇しました。FREExtension 関数/クラスでは、 FREContext の新しいインスタンスを返す必要があり、FREContext のそのインスタンスでは、関数マップを返す必要があります。地図を返さず、頭を切り落とされたニワトリのように、何が起こっているのかを把握しようとして走り回るという過ちを犯しました。うまくいけば、それは将来誰かを助けるでしょう。

于 2012-08-27T17:36:33.777 に答える
0

私はこの問題を解決しました。私は別の ANE プロジェクトから始めてそこから構築したので、完全にはわかりません。しかし、問題は、コードの ActionScript 部分と拡張記述子のパッケージ名が間違っていたことに関係していると思われます。

于 2011-12-06T20:50:17.623 に答える