C++與Lua交互原理實例詳解

首先,不同語言交互,我們一般把這種編程方式稱為混合編程。開發中為什麼要多語言混合使用,隻用c++不行嗎?答案是因為腳本語言語法糖多使用方便、沙盒式安全機制使系統更穩定、簡單易學降低開發成本等,那麼,隻用腳本不行嗎?那也是不合理的,因為與系統api的接口、計算密集性模塊的性能要求等是腳本語言不擅長的,這一部份仍然需要c/c++來完成。因此,為瞭綜合各自的優勢,就出現瞭混合編程的需要。

那麼,在一個程序的生命周期裡,具體哪些部份c++寫,哪些部份是腳本寫?它們的交互接口又在哪裡?一般與系統緊密相關的,如程序啟動、創建窗口及渲染器、事件循環分發,各種窗口消息、網絡事件的接收分發等一般c++來做。而具體邏輯相關的,如消息和事件的處理器(事件驅動),會根據傳入的參數及當前狀態做出反應,包括改變腳本自身環境內的變量,調用綁定的c函數從而修改c/c++端的變量等一般腳本來做。

然後,它們又是在哪裡交互的,怎麼交互的?簡單點講就是維護瞭一個堆棧,需要交互的數據通過入棧,出棧操作來傳遞數據。而具體腳本語言的實現機制,一般來說都會有一個編譯模塊、一個虛擬機(執行)模塊、一套類型實現及數據管理模塊,通常還會有一個供外部操作的接口,如lua c api,這個接口讓嵌入方得以操作腳本狀態(如訪問變量、調用函數、管理內存),實現交互。

最後,總結一下,所有程序最終都是以機器碼的形式被硬件CPU執行,從這個角度去看,不同語言的代碼並沒有本質區別,最終都是被編譯器編譯從二進制機器碼,而所謂交互,就是在處理共享數據而已。

tolua工具的使用
cocos2dx c++與lua 綁定具體流程:使用的cocos版本是3.4,Mac環境,但Windows上和cocos的其它版本流程也是一樣。

修改cocos本身的類接口綁定到Lua

具體步驟:

1,找到cocos自帶的綁定工具腳本文件genbindings.py,在cocos工程的frameworks/cocos2d-x/tools/tolua這個目錄下,把這個文件打開。

2,在打開的genbindings.py文件下面找到這麼一段代碼:

在這裡插入圖片描述

這裡就是運行這個腳本會自動生成lua綁定代碼的所有對象和這些對象所在的目錄與綁定代碼生成的目的路徑,#是註釋,通過它指定隻生成修改過的模塊的綁定代碼。

3,運行genbindings.py,打開命令行工具,cd到這個目錄,再在當前目錄運行這個腳本。(1,cd + tolua目錄路徑 2,./genbindings.py)

4,xcode重新編譯下c++代碼,綁定成功。

自定義類綁定到Lua

1,寫好自定義類,我們一般把這個類放在Classes目錄,我自己項目的目錄如下:

在這裡插入圖片描述

2,寫好這個類的.ini配置文件,copy其它的.ini配置,隻需要改下類名空間,路徑等,多個類寫一個配置裡信息用空格隔開。具體示意圖如下:
我的配置文件:

在這裡插入圖片描述

配置文件主要修改地方:

在這裡插入圖片描述

3,運行genbindings.py腳本,就會在指定目錄自動生成自定義類綁定到lua的代碼。

在這裡插入圖片描述

4,最後是把生成的綁定代碼註冊到lua環境棧,如圖所示:

在這裡插入圖片描述

cocos AppDelegate.cpp裡的這個代碼完成的創建lua環境棧和註冊:

在這裡插入圖片描述

註意事項

1,自己新增的自定義類,打包到andriod上時,需要修改安卓的打包配置,把新增的文件添加進去(不光針對這裡,所有打安卓包,新增的東西都是要加入到這個配置中才會拷貝)。示意圖如下:

在這裡插入圖片描述
在這裡插入圖片描述

2,mac終端中執行genbindings.py這個腳本,如果報“ImportError: No module named yaml”這個錯誤,解決方式是:在終端中逐個輸入:以下3句命令,mac會自動幫我們下載安裝這3個東東,安裝完畢就可以瞭。
在終端分別逐行輸入以下內容:

sudo easy_install pip
sudo pip install PyYAML
sudo pip install Cheetah

到此這篇關於C++與Lua交互原理實例詳解的文章就介紹到這瞭,更多相關C++與Lua交互原理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: