首页 > 其他分享 >xlua - 增加lua-cjson库

xlua - 增加lua-cjson库

时间:2024-03-03 22:33:39浏览次数:29  
标签:filePath cjson xlua dll lua LuaEnv Lua

xlua貌似不支持单独动态加载cjson.dll,试了各种方式,都是会造成Unity闪退,也不知道原因。

解决办法就是直接编译进xlua.dll

 

1) 下载lua-cjson源码,并解压到xlua的build文件夹根目录

GitHub - openresty/lua-cjson: Lua CJSON is a fast JSON encoding/parsing module for Lua

 

2) CMakeLists.txt中加入以下配置

#begin lua-cjson
set(CJSON_SRC
    "lua-cjson-2.1.0.13/strbuf.c"
    "lua-cjson-2.1.0.13/lua_cjson.c"
    "lua-cjson-2.1.0.13/fpconv.c"
)
#add_definitions(-DUSE_INTERNAL_FPCONV)
if (WIN32)
    add_definitions(-DDISABLE_INVALID_NUMBERS)
endif()
set_property(
    SOURCE ${CJSON_SRC}
    APPEND
    PROPERTY COMPILE_DEFINITIONS
    LUA_LIB
)
list(APPEND THIRDPART_INC "lua-cjson-2.1.0.13")
set(THIRDPART_SRC ${THIRDPART_SRC} ${CJSON_SRC})
#end lua-cjson

 

3) lua_cjson.c需要做部分修改

a) int luaopen_cjson(lua_State *l)

改为

LUALIB_API luaopen_cjson(lua_State *l)

 

b) int luaopen_cjson_safe(lua_State *l)

改为

LUALIB_API luaopen_cjson_safe(lua_State *l)

 

4) 这边要编译Window下的lua5.3的x64版本的dll,所以运行make_win64_lua53.bat

 

5) 将新生成的xlua.dll替换Unity中的(如果Unity已打开,需要重启下,才能加载新的dll)

 

6) 测试是否成功

新建MyLua.cs,用于放dll加载代码

namespace XLua.LuaDLL
{
    public partial class Lua
    {
        [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern int luaopen_cjson(System.IntPtr L);

        [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        public static int LoadCJson(System.IntPtr L)
        {
            return luaopen_cjson(L);
        }
    }
}

新建Lua脚本,Lua/Test8.lua.txt

local cjson = require("cjson")

local jsonStr = '{"1": "one"}'

local jsonObj = cjson.decode(jsonStr)
print(jsonObj["1"])

Test8.cs

public class Test8 : MonoBehaviour
{
    private LuaEnv m_LuaEnv;

    void Start()
    {
        m_LuaEnv = new LuaEnv();
        m_LuaEnv.AddLoader((ref string filePath) =>
        {
            filePath = filePath.Replace('.', '/');
            filePath = $"Assets/{filePath}.lua.txt";
            var txtAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(filePath);
            return Encoding.UTF8.GetBytes(txtAsset.text);
        });

        m_LuaEnv.AddBuildin("cjson", XLua.LuaDLL.Lua.LoadCJson);
        m_LuaEnv.DoString("require('Lua.Test8')");
    }

    void OnDestroy()
    {
        if (null != m_LuaEnv)
            m_LuaEnv.Dispose();
    }

}

 

 7) 运行结果

 

参考

[RS] xLua从LuaJit升级Lua5.3记录 - 简书 (jianshu.com)

 

标签:filePath,cjson,xlua,dll,lua,LuaEnv,Lua
From: https://www.cnblogs.com/sailJs/p/18050819

相关文章

  • lua5.1 - function env
    注意:只在lua5.1才支持,后面的lua版本做了改动不再兼容 myEnv.lualocalmyEnv={}myEnv.a=1myEnv.b="one"myEnv.log=printreturnmyEnv Test.lualocalmyEnv=require("myEnv")setfenv(1,myEnv)--调用上面的函数后,print将没法使用因为那是在全局env......
  • Lua学习笔记3
    Lua学习笔记3IO读写Lua中读写使用自带的I/O库处理文件。分为简单模式和完全模式。简单模式(simplemodel)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。完全模式(completemodel)使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件......
  • lua协程 - 把回调模式的代码流程改成顺序执行流程
    像ugui的点击按钮,然后触发相关逻辑,都是回调模式的写法,比如下面代码的ShowAlert调用publicclassTest7:MonoBehaviour{publicGameObjectm_Alert;publicTextm_TxtMsg;publicButtonm_BtnYes;publicButtonm_BtnNo;privateLuaEnvm_LuaEnv;......
  • xlua - lua调用c#函数
    c#部分publicclassTest5Obj{publicinti;privatestringstr;publicTest5Obj(){}publicvoidPrintInt(){Debug.Log($"c#PrintInt:{i}");}publicvoidPrintStr(){Debug.Log($"c#Prin......
  • xlua - lua协程与Unity协程
    lua脚本:Assets/Lua/Test3.lua.txtlocalmove_end={}localLuaEnumeratorImpl={}LuaEnumeratorImpl.__index=LuaEnumeratorImplfunctionLuaEnumeratorImpl.new(coRun)localobj={}setmetatable(obj,LuaEnumeratorImpl)obj:ctor(coRun)retu......
  • xlua - lua中操作c#对象
    1,c#对象映射为lua的userdataa)默认情况,c#对象都是映射为lua的userdata,数据存放在c#层,调用函数也是走c#层。functionLuaUseVector3(v1,v2)v1.x=10print(type(v1),v1.x,v1.y,v1.z)print("v1:",v1,"v2:",v2)print("v1+v2:",v1+v2)v1......
  • xlua - c#访问lua函数
    lua代码Assets/Lua/Test1.lua.txtfunctionIntParam(p)print("~~~~~IntParam")print(type(p),p)print("~~~~~")returnpendfunctionVec3Param(p)print("~~~~~Vec3Param")print(type(p),p.x,p.y,p.z)......
  • Lua调试函数 debug.getinfo() namewhat详解
    Lua调试的时候会用到debug.getinfo()函数,what的值文档给了解释:"Lua":Luafunction"C":Cfunction"main":mainpartofachunk(通过load函数等执行的语句)关于namewhat的值到底表示什么,官方文档只是简单列举(不全)。列举一些常见情况localgetinfo=debug.getinfol......
  • Redis加Lua脚本实现分布式锁
    先讲一下为什么使用分布式锁:在传统的单体应用中,我们可以使用Java并发处理相关的API(如ReentrantLock或synchronized)来实现对共享资源的互斥控制,确保在高并发情况下同一时间只有一个线程能够执行特定方法。然而,随着业务的发展,单体应用逐渐演化为分布式系统,多线程、多进程分布在不同......
  • 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)
    单一数字评估指标无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差。所以当团队开始进行机器学习项目时,经常推荐他们为问题设置一个单实数评估指标。......