首页 > 其他分享 >Jx9 虚拟机

Jx9 虚拟机

时间:2023-03-28 19:12:43浏览次数:43  
标签:JX9 Jx9 虚拟机 vm nRes jx9

 一、Jx9 虚拟机的生命周期
  1. 加载 Jx9 脚本 jx9_compile() 或 jx9_compile_file(),加载编译成功后,Jx9 引擎将自动创建一个实例 (jx9_vm) 并且返回指向此虚拟机的指针用于后续调用。
  2. 如加载编译 Jx9 脚本时出现问题,也就是编译时出错,可调用jx9_config()方法获取编译错误原因。
  3. (可选) jx9_vm_config(),向脚本中传递参数(JX9_VM_CONFIG_ARGV_ENTRY)及注册虚拟机与脚本语言之间数据交互的回调函数(JX9_VM_CONFIG_OUTPUT)。
  4. (可选)jx9_create_function() ,用于注册可以从 Jx9 脚本调用的外部函数(通常是 C/C++ 实现的函数)。
  5. 执行Jx9 脚本 ,调用 jx9_vm_exec() 执行 Jx9 程序。
  6. jx9_vm_extract_variable() 用于提取在 Jx9 脚本中声明的另一个变量的内容。
  7. 重置虚拟机 使用 jx9_vm_reset()的虚拟机,然后返回到步骤 5,执行此操作零次或多次。
  8. 使用 jx9_vm_release() 销毁虚拟机。

 

二、Jx9 C/C++ API 参考

  Jx9 - 可嵌入的脚本引擎 (symisc.net)

 

三、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;
}

标签:JX9,Jx9,虚拟机,vm,nRes,jx9
From: https://www.cnblogs.com/bzbk/p/17203082.html

相关文章

  • 深入理解 python 虚拟机:pyc 文件结构
    深入理解python虚拟机:pyc文件结构在本篇文章当中主要给大家介绍一下.py文件在被编译之后对应的pyc文件结构,pyc文件当中的一个核心内容就是python字节码。pyc......
  • CNStack 虚拟化服务:实现虚拟机和容器资源的共池管理
    作者:林苍背景容器无疑已经成为新的云计算基础设施,企业私有云平台的建设重心,正在从虚拟化的计算、存储、网络的建设,转向构建以容器、微服务等为核心的云原生平台。不过......
  • Ubuntu 虚拟机搭建
    一、基础版本二、搭建步骤三、基础环境配置 一、基础版本外部系统:Windows10虚拟机环境:VirtualBox7.0Ubu......
  • 一句话讲明Hyper-V虚拟机如何上网
    最近研究Hyper-V,好像提问比较多的就是Hyper-V要上网怎么办 Hyper-V要上网,你就现在Hyper-V里面创建一个的switch,switch会在物理主机上创建一个虚拟网卡,虚拟网卡和物理网卡......
  • macOS10.14虚拟机安装VMware Tools失败的解决方案
    Windows10中采用VMware15安装安装macOS10.14教程Windows10中macOS10.14虚拟机性能优化教程安装VMwareTools安装VMwareTools后系统会更加流畅,实现自动全屏直接点击上方虚拟......
  • 一例vmware 虚拟机造成局域网游戏魔兽争霸看不到对方
     问题:windows8/win8不能连局域网玩魔兽争霸,cs等局域网游戏,确认是连的同一台路由器,防火墙已关。 我经过检查后发现,主机使用vmware虚拟机软件,vmware虚拟机会产生VMware......
  • 用DiskGenius打开虚拟机磁盘文件vmdk的方法
    如何用DiskGenius打开虚拟机磁盘文件vmdk当然此方法也适合虚拟机无法正常启动,但虚拟机里重要文件时可以用此方法将文件复制出来.1、启动DiskGenius分区工具,根据图上点击......
  • 主机、虚拟机和开发板网络连接(虚拟机桥接模式)
    一.为主机配置合适的IP,子网掩码,网关以及DNS服务器步骤:右击网络-->“打开“网络和Internet”设置-->更改适配器选项-->本地连接(或者叫以太网)-->属性 -->Interne......
  • openEuler开源新项目,嵌入式实时虚拟机ZVM介绍
    嵌入式实时虚拟机ZVM(Zephyr-basedVirtualMachine)是由湖南大学嵌入式与网络计算湖南省重点实验室(以下简称“湖大嵌入式实验室”)主任谢国琪教授主导设计并开发的虚拟化软件......
  • VMware中怎样克隆虚拟机
    场景在上面搭建完虚拟机后,如果要进行学习的练手,为了防止把虚拟机玩坏,需要进行虚拟机的克隆。在克隆版本上进行练手,一旦练蹦了,可以再重新复制一个。实现打开VMware,选中虚拟机......