У меня есть старый код, который я пытаюсь очистить в проекте, который использует Adobe Crossbridge для управления бэкендом C ++ и внешним интерфейсом AS3. Код не в полной мере использовал возможности взаимодействия, и я пытаюсь работать в этом направлении, но все документы кажутся устаревшими, активных форумов не возникает, и всякий раз, когда я пробую большую часть примеры, похоже, не работают, поэтому я начну с более простых преобразований, чтобы освоиться с ними.
Сейчас я сталкиваюсь с проблемами при использовании package_as3 для импорта классов AS3. Вот слишком упрощенный пример некоторых пространств имен, которые мы имеем:
namespace A
{
inline void func1(int a, int b)
{
inline_nonreentrant_as3("import MyAS3Class;");
inline_nonreentrant_as3("MyAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("import MyAS3Class;");
inline_nonreentrant_as3("MyAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
namespace B
{
inline void func1(int a, int b)
{
inline_nonreentrant_as3("import com.packagename.MyOtherAS3Class;");
inline_nonreentrant_as3("MyOtherAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("import com.packagename.MyOtherAS3Class;");
inline_nonreentrant_as3("MyOtherAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
Этот код работает, но я не уверен, что компилятор может оптимизировать повторяющийся импорт, особенно при последующих вызовах той же функции, но кажется разумным отменить импорт, если только по причинам, отличным от читабельности. Поэтому я попытался сделать это, используя package_as3, вот так:
namespace A
{
package_as3("import MyAS3Class;");
inline void func1(int a, int b)
{
inline_nonreentrant_as3("MyAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("MyAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
namespace B
{
package_as3("import com.packagename.MyOtherAS3Class;");
inline void func1(int a, int b)
{
inline_nonreentrant_as3("MyOtherAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("MyOtherAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
Интересно, что вызов функций в пространстве имен A работает нормально, но вызов функций в пространстве имен B вызывает ошибку ReferenceError во время выполнения.
[Fault] exception, information=ReferenceError: Error #1065: Variable MyOtherAS3Class is not defined.
Как я уже говорил, пример чрезвычайно упрощен, но, насколько я могу судить, единственное реальное различие между ними состоит в том, что один из классов AS3 (MyAS3Class) находится в корне исходного кода проекта, а другой — (MyOtherAS3Class). ) не является. Я попытался использовать полностью определенное имя (то есть com.packagename.MyOtherAS3Class.func1 (…)), помимо прочего, но затем я получил тот же ReferenceError, говоря: «Переменная com не определена». Кто-нибудь знает, что здесь происходит?
Задача ещё не решена.
Других решений пока нет …