FlashCC学习札记

前段时间项目中有一个功能模块用到了FlashCC,将C++的代码编译成swc文件,以便在Flash工程中使用。开发过程中遇到一些问题,现在记录下来,以便日后查阅。

一、开发环境搭建

说明:本文所使用的FlashCC版本为1.0.1, 操作系统为Windows7 Professional 32位

相对于FlashCC的前身Alchemy来说,FlashCC的开发环境搭建已经简化了许多,一些开发过程中依赖的组件已经默认集成到官方提供的定制Cygwin当中。首先需要注意最小系统需求,下面是官方给出的标准:

  • Flash Player 11 or higher
  • Flex SDK 4.6 or higher
  • Java Virtual Machine (64-bit)
  • Window平台需要:Microsoft® Windows® 7 (64-bit edition)

其中前两点必须要满足。至于后两点,我的开发机器用的是Win7 32位系统,装的Java虚拟机也是32位的,实际操作中也没有发现太大问题(不过建议有条件的话最好还是使用官方标准)。

了解基本需求后到各个网站上下载Flex SDK、JRE、FlashCC开发包(1.0.1版本),下载完成后继续下面的步骤:

1、解压FlexSDK(本文中解压路径为F:\Flex\flex_sdk_4.6)

2、安装JRE

3、解压FlashCC开发包(已经内置了定制版的cygwin) (本文中解压路径为F:\Flash\FlasCC_1.0.1)

4、使用文本编辑器打开F:\Flash\FlasCC_1.0.1\samples\Makefile.common, 修改FLASCC及FLEX变量为下面的值:

FLASCC:=/cygdrive/f/Flash/FlasCC_1.0.1/sdk
FLEX:=/cygdrive/c/flex

至此,FlashCC的开发环境就搭建好了,下面来尝试编译FlashCC开发包中自带的示例程序。

二、编译样例程序

直接运行F:\Flash\FlasCC_1.0.1\run.bat,切换工作目录到01_HelloWorld下:

注意:如果使用的是32位Java虚拟机,则需要修改一下01_HelloWorld下的Makefile, 在编译命令后加上-jvmopt=-Xmx1G

否则会报下面的错误:

“LLVM ERROR: Error: Unable to launch the Java Virtual Machine.
This usually means you have a 32bit JVM installed or have set your Java heap siz
e too large.
Try lowering the Java heap size by passing "-jvmopt=-Xmx1G" to gcc/g++.”

在cygwin窗口中输入make:

一切顺利的话,会在01_HelloWorld目录下多出hello.exe和hello.swf两个文件,使用FlashPlayer打开hello.swf,效果如下:

 

三、开发中遇到的问题

1、FlashCC使用cygwin编译代码,而cygwin是一个linux环境的模拟器,所以要求被编译的代码要使用标准C/C++。或者是做一些跨平台处理。

2、一开始在项目中编译C++代码成swc文件之后,使用Flash Professional CS5.5建立以一个测试项目,实际运行的时候发现有个地方总是分配不到内存,后来在FlashCC官方论坛上提问,才发现是由于编译时指定的flash版本过低所致(FlashCC要求编译时flash版本最低为11), 论坛上的提问。

3、以前安装的Flash Professional CS5.5发布swf时flash版本最高只能指定到10.2,可以参考下面的文章来添加更高版本的flash支持

Adding Flash Player 11 support to Flash Pro CS5 and CS5.5

4、关于从AS3代码中向C++中传递ByteArray参数的方法,一开始参考了这篇文章,实际测试中发现这种方法在我编写的功能模块中并不能正确工作。后来采用官方Demo中的数据传递方法成功解决了ByteArray传参问题。贴出参考代码:

AS3
 1 // First lets fill a ByteArray like we normally would in ActionScript 
 2 var bytes:ByteArray = new ByteArray(); 
 3 bytes.endian = "littleEndian"; 
 4 for (var j:int = 0; j < 10; j++) 
 5    bytes.writeInt(j);
 6 
 7 bytes.position = 0;
 8 
 9 // Now we want a pointer to that ByteArray 
10 var bytesPtr:int = CModule.malloc(bytes.length);
11 
12 // Use CModule.writeBytes() to write the ByteArray we created into flascc's 
13 // main memory.  The parameters of writeBytes() are first the pointer in flascc 
14 // memory, the length of the ByteArray, and the ByteArray itself 
15 CModule.writeBytes(bytesPtr, bytes.length, bytes); 
16 printLine("Checksum: " + MyLib.examineBytes(bytesPtr, bytes.length)); 
17 CModule.free(bytesPtr);
C
 1 __attribute__((annotate("as3sig:public function _wrap_examineBytes(buffer:int, bufferSize:int):int"))) 
 2 void _wrap_examineBytes() { 
 3   unsigned char *arg1 = (unsigned char *) 0 ; 
 4   int arg2 ; 
 5   int result ; 
 6   { 
 7     AS3_GetScalarFromVar(arg1, buffer); 
 8   } 
 9   { 
10     AS3_GetScalarFromVar(arg2, bufferSize); 
11   } 
12   result = (int)examineBytes((unsigned char const *)arg1,arg2); 
13   { 
14     AS3_DeclareVar(asresult, int); 
15     AS3_CopyScalarToVar(asresult, result); 
16   } 
17   { 
18     AS3_ReturnAS3Var(asresult); 
19   } 
20 }

 

PS:附上FlashCC 官方论坛地址

http://forums.adobe.com/community/game_developers/flascc

 

版权说明:本文章版权归本人及博客园共同所有,未经允许请勿用于任何商业用途。转载请标明原文出处:

http://www.cnblogs.com/talywy/archive/2013/04/03/2997702.html

转载于:https://www.cnblogs.com/talywy/archive/2013/04/03/2997702.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

”凉凉“ 的故事

某一天&#xff0c;我在给数据匹配编码的时候发现一个数据匹配不到编码&#xff0c;我怀疑是码表问题&#xff0c;终于发现一个非常奇妙的事情&#xff1a;两个一模一样的字符串竟然不相等&#xff1f;&#xff1f;&#xff1f; 屌爆了&#xff0c;我上下左右看遍了也没看出这2…

面向对象理论概述

2019独角兽企业重金招聘Python工程师标准>>> 转载自&#xff1a;http://my.oschina.net/brucelee80/blog 面向对象与面向过程的区别 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就…

网络设备驱动介绍

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、网络设备驱动概述 1、什么是网络设备 &#xff08;1&#xff09;网络设备&#xff1a;物理网卡在linux中形成的体系软件表现。 &#xff08;2&#xff09;物理网卡&#xff…

山东理工ACM【2561】九九乘法表

九九乘法表 Time Limit: 1000ms Memory limit: 65536K 有疑问&#xff1f;点这里^_^ 题目描述 九九乘法表是数学学习的基础&#xff0c;今天我们就来看看乘法表的相关问题。《九九乘法歌诀》&#xff0c;又常称为“小九九”,如下图所示。你的任务是写一个程序&#xff0c;对…

java ajax 定时刷新_用ajax技术实现无闪烁定时刷新页面

function makeRequest() {var guid rnd();//记住给个随机数&#xff0c;不然的话有缓存var url "example_b.aspx?id" guid;createXMLHttpRequest();xmlHttp.onreadystatechange handleRefresh;xmlHttp.open("GET", url, false);xmlHttp.send(null);}/…

platform驱动开发套路、DM9000的一些分析

1、 模块加载函数&#xff0c;是通过platform_driver_register()、platfprm_driver_unregister函数进行platform_driver的注册和注销&#xff1b; 原先注册和注销字符设备的工作&#xff0c;被移交给platform_driver的probe()成员函数和remove()成员函数中。 第一句是将硬件信…

Android企业级程序完全退出的解决方案

一、问题描述 在平常开发的过程中可以发现&#xff0c;很多开发者对于程序的退出都没有去认真的解决。一般要么是一个简单的finish&#xff08;只是退出当前的activity&#xff09;&#xff0c;要么是其他的方法&#xff0c;比如&#xff1a; 1、第一种方法&#xff1a;首先获取…

块设备驱动介绍

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、正确理解块设备驱动的概念 1、块设备和字符设备的差异 块和字符是两种不同的访问设备的策略&#xff1b;同一个设备可以同时支持块和字符两种访问策略&#xff1b;设备本身的物…

java中有scoreframe类型嘛_java构造函数的三种类型总结

我们说构造函数能处理参数的问题&#xff0c;但其实也要分三种情况进行讨论。目前有三种类型&#xff1a;无参、有参和默认。根据不同的参数情况&#xff0c;需要我们分别进行构造函数的讨论。这里重点是无参构造函数的初始化也要分两种方法进行分析。下面我们就这三种不同的构…

netbeans搭建安卓开发环境

2019独角兽企业重金招聘Python工程师标准>>> NetBeans 上开发 Android 应用程序需要安装一个 Android SDK 和针对 NetBeans 的 Android 开发插件 下载并安装 Android SDK 下载 Android SDK 解压后运行 tools\android.bat update sdk 进行升级&#xff0c;根据所选内…

VS2010皮肤控件介绍

在我们平时使用的各种工具中&#xff0c;如QQ&#xff0c;迅雷&#xff0c;以及各种空间等&#xff0c;都提供了一些换肤功能&#xff0c;可以让我们选择各种我们喜欢的界面。本文就对VS中常用的窗口程序做一个简单的换肤&#xff0c;利用一个dll文件来进行实现。 首先我们要加…

MySQL和Mariadb都启动不了了_linux centos7mariadb安装成功启动不了 解决思路

查看系统日志/var/log/mariadb/mariadb.log190313 14:31:03 InnoDB: Database was not shut down normally!InnoDB: Starting crash recovery.InnoDB: Reading tablespace information from the .ibd files...InnoDB: Restoring possible half-written data pages from the dou…

java 线程转储_获取Java线程转储的常用方法(推荐)

1. 线程转储简介线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。Java中的线程模型, 直接使用了操作系统的线程调度模型, 只进行简单的封装。线程调用栈, 也称…

Oracle conn 协议适配器错误解决

Oracle conn 协议适配器错误 --解决方法C:\Documents and Settings\administrator>set oracle_sidmyoracleC:\Documents and Settings\administrator>sqlplus /nologSQL*Plus: Release 10.2.0.1.0 - Production on 星期三 12月 26 09:47:16 2012Copyright (c) 1982, 2005…

python给定一个整数n、判断n是否为素数_输入一个大于3的整数n,判断它是否为素数...

#include //让n被i除(i的值从2到n-1)int main(){int n,i;printf("please enter a integer number,n?");scanf("%d",&n);for(i2;i<n-1;i)if(n%i0) break;if(i",n);else printf("%d is a prime number.",n);return 0;}**************…

编译Ngnix遇到的问题,查看程序依赖的库文件

要点:ldd 可以读取每个可以运行的程序依赖的 so 文件。 编译的时候提示需要Openssl库. 查看本机,已经安装了openssl 查看编译报错文件,查找Openssl所依赖的库 more objs/autoconf.err 查看openssl所依赖的库文件 ldd /usr/bin/openssl ldd –u /usr/bin/openssl objdump -x ob…

[JavaWeb修行之路 Day1] 安装、配置、部署Tomcat

一、相关软件下载 Tomcat下载地址&#xff1a;http://tomcat.apache.org 。选择Tomcat 6或者Tomcat 7。Eclipse下载地址&#xff1a;http://www.eclipse.org/downloads/ 。选择Eclipse IDE for Java EE Developers进行下载。当然&#xff0c;也可以使用MyEclipse&#xff0c;收…

应用层为何不能设置分辨率

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 5、在应用程序中设置分辨率 &#xff08;1&#xff09;可视分辨率&#xff08;即实际分辨率&#xff09;、虚拟分辨率 &#xff08;2&#xff09;实验及结果 vinfo.xres 1024; …

Vagrant 快速入门

1. Vagrant功能: Vagrant uses Oracle’s VirtualBox to build configurable, lightweight, and portable virtual machines dynamically.. 【Vagrant 使用Oracle VM VirtualBox 动态创建和配置轻量级的&#xff0c;可重现的&#xff0c;便携的虚拟机环境。】 2. Vagrant下载: …

各种分页存储过程 (转)

在项目中&#xff0c;我们经常遇到或用到分页&#xff0c;那么在大数据量&#xff08;百万级以上&#xff09;下&#xff0c;哪种分页算法效率最优呢&#xff1f;我们不妨用事实说话。 测试环境 硬件&#xff1a;CPU 酷睿双核T5750 内存&#xff1a;2G 软件:Windows server 20…