一、Jx9 虛擬機的生命周期 載入 Jx9 腳本 jx9_compile() 或 jx9_compile_file(),載入編譯成功後,Jx9 引擎將自動創建一個實例 (jx9_vm) 並且返回指向此虛擬機的指針用於後續調用。 如載入編譯 Jx9 腳本時出現問題,也就是編譯時出錯,可調用jx9_co ...
一、Jx9 虛擬機的生命周期
- 載入 Jx9 腳本 jx9_compile() 或 jx9_compile_file(),載入編譯成功後,Jx9 引擎將自動創建一個實例 (jx9_vm) 並且返回指向此虛擬機的指針用於後續調用。
- 如載入編譯 Jx9 腳本時出現問題,也就是編譯時出錯,可調用jx9_config()方法獲取編譯錯誤原因。
- (可選) jx9_vm_config(),向腳本中傳遞參數(JX9_VM_CONFIG_ARGV_ENTRY)及註冊虛擬機與腳本語言之間數據交互的回調函數(JX9_VM_CONFIG_OUTPUT)。
- (可選)jx9_create_function() ,用於註冊可以從 Jx9 腳本調用的外部函數(通常是 C/C++ 實現的函數)。
- 執行Jx9 腳本 ,調用 jx9_vm_exec() 執行 Jx9 程式。
- jx9_vm_extract_variable() 用於提取在 Jx9 腳本中聲明的另一個變數的內容。
- 重置虛擬機 使用 jx9_vm_reset()的虛擬機,然後返回到步驟 5,執行此操作零次或多次。
- 使用 jx9_vm_release() 銷毀虛擬機。
二、Jx9 C/C++ API 參考
三、Jx9 虛擬機編寫
//判斷Jx9腳本文件是否存在 bool exists_jx9(string strJx9File) { struct stat buffer = { 0 }; return (stat(strJx9File.c_str(), &buffer) == 0); }
//讀取Jx9腳本文件 string read_jx9(string strJx9File) { string strRet = _T(""); size_t sJx9Size = 0; std::vector<char> vszBuffer; vszBuffer.clear(); std::shared_ptr<std::iostream> pJx9Script = std::make_shared<std::fstream>(strJx9File, std::ios::in | std::ios::binary); pJx9Script->seekg(0, ios::end); sJx9Size = pJx9Script->tellg(); pJx9Script->seekg(0); if (sJx9Size > 0) { vszBuffer.resize(sJx9Size); pJx9Script->read(&vszBuffer[0], sJx9Size); strRet.assign(vszBuffer.begin(), vszBuffer.end()); } return strRet; }
//列印錯誤日誌 void jx9_log(jx9* pEngine, int nResult) { int nLen = 0; const char *zErrLog = nullptr; if (nResult != JX9_COMPILE_ERR) { return; } /* Extract error log */ jx9_config(pEngine, JX9_CONFIG_ERR_LOG, &zErrLog, &nLen); if (nLen > 0) { /* zErrLog is null terminated */ printf(zErrLog); printf("\n"); } }
//回調函數 int Jx9_callback( const void *pOutput, unsigned int nOutputLen, void *pUserData /* Unused */) { return JX9_OK; }
int main(int argc, char** argv) { int nRes = -1; string strError = _T(""); string strJx9File = _T(""); string strJx9Script = _T(""); if (argc < 2) { printf("參數不夠!"); return 1; } printf("——————————Jx9 begin——————————\n"); strJx9File = string(argv[1]); jx9* pEngine = nullptr; /* JX9 engine handle*/ jx9_vm* pVm = nullptr; /* Compiled JX9 program */ c_jx9_fun jx9Fun; //判斷Jx9腳本是否存在 if (!exists_jx9(strJx9File)) { strError = "Jx9 腳本文件不存在!"; goto main_end; } //讀取Jx9腳本內容 strJx9Script = read_jx9(strJx9File); if (strJx9Script.empty()) { strError = "Jx9 腳本文件為空!"; goto main_end; } //初始化引擎 nRes = jx9_init(&pEngine); if (nRes != JX9_OK) { strError = "Jx9 引擎初始化失敗!"; goto main_end; } //編譯腳本 nRes = jx9_compile(pEngine, strJx9Script.c_str(), strJx9Script.length(), &pVm); if (nRes != JX9_OK) { // jx9_log(pEngine, nRes); strError = "Jx9 引擎編譯腳本失敗!"; goto main_end; } //註冊回調函數 nRes = jx9_vm_config(pVm, JX9_VM_CONFIG_OUTPUT, Jx9_callback, /* Output Consumer callback */ 0 /* Callback private data */ ); if (nRes != JX9_OK) { strError = "Jx9 註冊回調函數失敗!"; goto main_end; } //開始執行 nRes = jx9_vm_exec(pVm, 0); if (nRes != JX9_OK) { strError = "Jx9 執行失敗!"; goto main_end; } strError = "Jx9 執行成功!"; main_end: //釋放 if (pVm) { jx9_vm_release(pVm); } if (pEngine) { jx9_release(pEngine); } jx9_lib_shutdown(); printf(strError.c_str()); return 1; }