教學:利用VSCode在PC上構建原生遊戲模組

出自Minecraft基岩版开发Wiki
  • Nmod是一種用來變更Minecraft的工具。具體實現是使用 Cydia Substrate 來Hook掉libminecraftpe.so裡的函式。
  • 本教學的目的是取得編譯完成的so檔案,如何進行使用參見InnerCore原生遊戲模組教學。
  • 你只需要知道一些 C++ 和 JNI 的知識。

準備工作[編輯]

  1. 完備的NDK與MINGW64環境。
  2. 正確組態的VSCode。
  3. 一套hook框架——一般為 Cydia Substrate。

環境組態[編輯]

組態NDK[編輯]

下載NDK[編輯]

首先需要下載一套完整的NDK軟件包。這裏筆者使用的是r23c版,其餘版本請自測,儘量不使用小於r19c版的軟件包。然後將軟件包解壓到本地任意目錄,你應該會得到一個類似圖中所示的資料夾。

解壓NDK

組態NDK環境變數[編輯]

由於筆者使用的是Win11系統,故此處以Win11為例。如果你是Win10系統,這個或許能幫你定位到環境變數頁面。

此電腦右鍵選擇屬性

在彈出頁面選擇高級系統設定

繼續選擇環境變數

在新頁面的系統變數中選中Path後雙擊,或者點擊編輯,進入編輯頁面。

在彈出的設定界面點擊新建,然後填入NDK根目錄的路徑。筆者的為E:\android-ndk-r23c,具體情況視你解壓目錄為定。

接下來設定clang編譯器的變數路徑。筆者的為E:\android-ndk-r23c\toolchains\llvm\prebuilt\windows-x86_64\bin。請以此為例例,在在你的NDK目錄下找到編譯器路徑,並將其按照上一步過程將路徑填入,然後依次點擊確定按鈕即可。至此,你已經完成了NDK的組態。

組態MINGW64[編輯]

下載MINGW64[編輯]

首先需要下載一個完整的MINGW64包。這裏筆者推薦的是x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0版,可以相容32位的電腦。然後將包解壓到本地任意目錄,你應該會得到一個類似圖中所示的資料夾。

組態MINGW64環境變數[編輯]

組態NDK環境變數類似,你需要找出gcc編譯器的路徑,筆者這裏是E:\mingw64\bin,請以此為例例,在在你的MINGW64目錄下找到編譯器路徑, 並將其按照之前的步驟設定好環境變數。

測試[編輯]

如果此前的環境變數你都設定完成並儲存退出了,現在請在按住鍵盤win鍵的情況下按R鍵,在彈出視窗輸入cmd並點擊確認

啟動cmd後輸入gcc -v並回車,如果有類似圖中的輸出特別是版本號,就説明MINGW64組態正確。筆者使用的gcc為8.1.0,如果你使用筆者提供的包,應當也如此。如果版本號不同,要么你下錯包了,要么你電腦中存在其它包含gcc編譯器的環境,如果在後續過程中沒有影響,也可無視。

輸入clang -v並回車,如果有類似圖中的輸出,就説明clang編譯器組態正確。

輸入ndk-build -v並回車,如果有類似圖中的輸出,就説明NDK組態正確。

組態VSCode[編輯]

當以上環境全部測試完成後,就可以準備VSCode了。首先需要下載安裝本體,開啟後預設為英文界面,請按照圖中所示下載中文外掛。 重啟後再安裝C/C++ Extension Pack,之後再重啟一次就完成外掛安裝了。

建立並組態專案[編輯]

這裏以armeabi-v7a架構為例子。同時我也提供了一個模板作為輪子,可以直接套用。

將模板解壓到本地,筆者的路徑為E:\example,然後透過VSCode開啟example這個根目錄。 一定要信任作者

jni目錄是重點,是NDK用來識別專案的目錄,其下有armeabi-v7aheadersincludes三個資料夾。其中armeabi-v7a用於存放MineCraft的動態連結庫檔案,headers用來存放專案需要用到的標頭檔,includes用來存放hook框架,即Cydia Substrate的原始碼。(這些資料夾名稱請不要輕易改動) .vscodeVSCode的組態檔夾,不能缺失和亂改(除非你知道自己在幹什麼)。不過由於模板換了環境,其中組態還是需要修改一下的。點開main.cpp後,在右下角有個Android標誌,點擊它(有時可能點不了,那是正常大病,點幾下編寫區,再回去點就是了),進行編輯組態 如果之前的所有步驟正常,此處的編譯器路徑應當會自動識別,點擊小三角後在下彈框中選g++即可。下一個包含路徑是重點,預設路徑都是筆者電腦上的標頭檔路徑。請以此為例,根據你電腦上MinGWNDK的安裝情況,找到例子中給的各個目錄,並進行替換。其中${workspaceFolder}\jni是專案根目錄,請勿修改。 jni目錄下的的兩個mk檔案是給NDK讀取的,筆者才疏學淺不在此處贅述了(希望有能之人在此補充)。筆者在檔案內略加註釋,如非專案環境和結構巨變,檔案內容基本不用修改。

生成so[編輯]

經過剛才對專案的組態,此時已經可以準備生成動態連結庫了。在主頁點擊上方終端,再點擊執行任務

其中的ndk編譯是筆者預先組態好的任務,使用它不出意外就可以編譯了。

正常編譯結束後左側會多出兩個資料夾(libsobj),其中我們只要libs下的libexample.so,其餘不要。(由於在Android.mk中,LOCAL_MODULE的名稱為example,所以此處為libexample.so)