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
總結
以上是生活随笔為你收集整理的FlashCC学习札记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity使用协程技术制作倒计时器
- 下一篇: Canvas Clock