openwrt 中使用C调用lua脚本(二)

上一篇介绍了简单的用C调用lua脚本,本文开始介绍如何用C调用lua并获取lua的多个返回值以及简单的JSON文件处理。

首先我们还是写一个lua脚本,姑且命名为function.lua

-- author: mleaf
-- mail: mleaf90@gmail.com 
require("common")
local cjson = require "cjson"

local ROOT_PATH = "/tmp/mleaf.org/"
local JSON_NAME = "test.json"

function get_json_list()
    local t = {}
    local file_path = ROOT_PATH .. JSON_NAME
    local ret,json = get_json_from_file(file_path)
    if ret == 0 then
        local json_list = json["json_list"]
        
        for key,value in pairs(json_list) do
            print(key, value["name"])
            table.insert(t, value["name"]);
        end
        
    end
    if next(t) == nil then --判断table是否为空
        print("lua print:[name table is nil]")
        ret = -4
    end
    
    return ret, t;
end


继续写function.lua所依赖的common.lua文件:

-- author: mleaf
-- mail: mleaf90@gmail.com 
local cjson = require "cjson"

function table_is_empty(t)
    return next(t) == nil
end

--[[
    Read json file
]]
function get_json_from_file(file_name)
    
    local ret,jsonData = 0,{}

    -- 1:open file
    local f = io.open(file_name, "r" )
    
    if f == nil then
        ret = -1
        print("lua print:[file does not exist!]" .. ret)
        return ret,jsonData
    end
    
    -- 2:read file
    local t = f:read( "*all" )
    f:close()
    
    if t ~= nil and t ~= "" then

        jsonData = cjson.decode(t);
        if jsonData == nil or table_is_empty(jsonData) then
            ret = -2
            print("lua print:[Json parsing failure! str:]" .. t)
            return ret, jsonData
        end
    else
        ret = -3
        print("lua print:[The file is empty!]" .. ret)
    end

    return ret,jsonData
end


然后当然是构造一个我们需要读取的json文件啦!

{
    "json_list": [
        {
            "name": "mleaf"
        }
    ]
}

好了要读取的文件和lua文件都已经写完,我们开始写C程序。

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
//调用lua中的get_json_list函数
void call_get_json_list(lua_State *L)
{
    int i;
    char *name;
    lua_getglobal(L, "get_json_list"); //获取get_json_list函数
    lua_pcall(L, 0, 2, 0); //调用函数,0个参数,2个返回值
    int ret = (int)lua_tonumber(L, -2); //获取Lua的第一个返回值
    printf("ret = %d\n", ret);
    if(0 == ret){
        int size = lua_objlen(L,-1);//相当于#table  
        for(i = 1; i <= size; i++)  
        {  
            lua_pushnumber(L, i);  
            lua_gettable(L, -2);
            name = (char *)lua_tostring(L, -1); //获取栈顶元素(结果)
            printf("name = %s\n", name);
            //这时table[i]的值在栈顶了  
            lua_pop(L, 1);//把栈顶的值移出栈,保证栈顶是table以便遍历。  
        }; 
    }
}
int main()
{
    lua_State *L = luaL_newstate(); //新建lua解释器
    luaL_openlibs(L); //载入lua所有函数库
    luaL_dofile(L, "function.lua"); //执行"Test.lua"文件中的代码
    call_get_json_list(L);
    lua_close(L); //释放
    return 0;
}

PS:由于我们写的lua文件中数据读取以及处理成功获得我们想要的数据时返回0所以我们C程序以此判断数据读取正确。

接下来到了我们关键的一步了,你要问我是什么???

当然是编译啦,不编译怎么运行?

这次我们交叉编译,直接在openwrt上运行。

执行如下命令:

sudo /home/mleaf/work/lede/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16/bin/mipsel-openwrt-linux-gcc -o call-lua2 call-lua2.c -I/home/mleaf/work/lede/staging_dir/target-mipsel_24kc_musl-1.1.16/usr/include/ -L/home/mleaf/work/lede/staging_dir/target-mipsel_24kc_musl-1.1.16/usr/lib -llua -lm -ldl



当然你得改成你工具链所在的目录。

编译完成我们用winscp将所有文件拷贝到openwrt的/tmp/mleaf.org目录下

最后执行我们的C程序,记得添加权限chmod a+x  call-lua2

我们修改一下test.json文件内容,删掉arry中的数据,变成如下内容:

{
    "json_list": []
}



再次执行C程序:


最后啰嗦两句:楼主将程序直接集成到系统中后发现function.lua找不到common.lua文件,看了打印信息,openwrt默认会在“/usr/lib/lua”以及“/usr/share/lua”等文件中查找依赖文件,只需要将common.lua文件安装至以上目录即可,还有记得openwrt中需要装上lua-cjson
 <*> lua-cjson……………………………………….. Lua CJSON parse

本文章由作者:佐须之男 整理编辑,原文地址: openwrt 中使用C调用lua脚本(二)
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐