Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数。对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (lua_CFunction)(lua_State L)。简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数。返回值是整型,表示该C函数将返回给Lua代码的返回值数量,如果没有返回值,则return 0即可。需要说明的是,C函数无法直接将真正的返回值返回给Lua代码,而是通过虚拟栈来传递Lua代码和C函数之间的调用参数和返回值的。实例代码:

// testlua.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include extern "C"{#include #include #include }//待Lua调用的C注册函数static int add2(lua_State* L){    //检查栈中的参数是否合法,1表示Lua调用时的第一个参数(从左到右),依此类推。    //如果Lua代码在调用时传递的参数不为number,该函数将报错并终止程序的执行。    double op1 = luaL_checknumber(L,1);    double op2 = luaL_checknumber(L,2);    //将函数的结果压入栈中。如果有多个返回值,可以在这里多次压入栈中。    lua_pushnumber(L,op1 + op2);    //返回值用于提示该C函数的返回值数量,即压入栈中的返回值数量。    return 1;}//待Lua调用的C注册函数。static int sub2(lua_State* L){    double op1 = luaL_checknumber(L,1);    double op2 = luaL_checknumber(L,2);    lua_pushnumber(L,op1 - op2);    return 1;}//待Lua调用的C注册函数。static int l_sin (lua_State *L) {    double d = lua_tonumber(L, 1); /* get argument */    lua_pushnumber(L, sin(d)); /* push result */    return 1; /* number of results */}int _tmain(int argc, _TCHAR* argv[]){    lua_State *L = luaL_newstate();    luaL_openlibs(L);    //将指定的函数注册为Lua的全局函数变量,其中第一个字符串参数为Lua代码    //在调用C函数时使用的全局函数名,第二个参数为实际C函数的指针。    lua_register(L, "add2", add2);    lua_register(L, "sub2", sub2);    lua_register(L, "l_sin", l_sin);    //在注册完所有的C函数之后,即可在Lua的代码块中使用这些已经注册的C函数了。    luaL_dofile(L,"test.lua");    //if (luaL_dostring(L,testfunc))    // printf("Failed to invoke.\n");    //const char *buf = "print('Hello World')";    //luaL_dostring(L,buf);    lua_close(L);    return 0;}

test.lua

function show()print("helloworld")print(add2(1.0,2.0))print(sub2(20.1,19))print(l_sin(1))end  show()

运行结果:

java 调用htm中js函数_Lua中调用C函数(lua5.2.3)相关推荐

  1. selenium中js定位_Selenium中的定位剂

    selenium中js定位 1.什么是Selenium定位器? (1. What is a Selenium Locator?) Selenium Locators are used for iden ...

  2. 【区块链】以太坊Solidity编程:合约调用与web3.js

    以太坊Solidity编程:合约调用与Web3.js 合约部署方法 合约的编译 使用浏览器编译器Remix 使用truffle编译,目前是最常用的编译方式 Solc或者Web3.js编译合约,使用相对 ...

  3. jsb调用java_在JS代码中使用反射调用java代码注意事项(附webview使用方法)(转)...

    本文是推荐使用过jsb.reflection的开发者进行阅读.关于jsb.reflection的说明请参照: 我们在代码编写过程中,通常会需要在js脚本中调用到java代码或者Objective-C的 ...

  4. java回调函数 final_java中带回调函数的字符串替换,类似js中的replace(rgExp,function)...

    在js中, replace函数的功能很强大,其原型是stringObj.replace(rgExp, replaceText), 而replaceText也可以是返回替换文本的函数.这个功能还是比较好 ...

  5. java中JSB,Cocos Creator 利用JSB进行JS和Android相互调用

    一.JS调用Android 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: Java var ...

  6. html 两个iframe重叠,解决同一页面中两个iframe互相调用jquery,js函数的方法

    这一个月又没更新博客,唉,懒癌又犯了,今天解决了一个问题,关于两个iframe互相调用jquery函数方法 a.html中有两个iframe,如下: b.html中有一个treeview,称为左菜单i ...

  7. java怎么调用存储函数_java中调用存储过程或存储函数的方法

    java中调用存储过程或存储函数的方法 1.调用存储过程:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{c ...

  8. 解决同一页面中两个iframe互相调用jquery,js函数

    这一个月又没更新博客,唉,懒癌又犯了,今天解决了一个问题,关于两个iframe互相调用jquery函数方法 a.html中有两个iframe,如下: <iframewidth="100 ...

  9. .php中js写法,js函数常见的写法以及调用方法

    写在前面:本文详细的介绍了5中js函数常见的写法以及调用的方法,平时看别人代码的时候总是看到各种不同风格的js函数的写法.不明不白的,找了点资料,做了个总结,需要的小伙伴可以看看,做个参考. 1.常规 ...

最新文章

  1. 美国国家政策基金会:美国科技秘密武器来自中国和印度
  2. JavaScript验证表单大全
  3. mysql python 3.5_python3.5 与 mysql 交互
  4. 点云赋值 PointCloudT::Ptr 运行时崩溃
  5. css cursor url用法格式详解
  6. PID控制器改进笔记之六:改进PID控制器之参数设定
  7. mysql root命令_MySQL 修改 root 密码命令
  8. 阿里 20 年,逍遥子宣告「全面迈入数字经济时代」
  9. sed 以及 awk用法
  10. 收藏| 一些可供参考的游戏出海技术架构与经验总结
  11. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第3节 综合案例_文件上传_3_综合案例_文件上传案例的服务器端...
  12. 安卓手机软件开发_你想拿高薪吗?想成为手机软件开发工程师吗?圆你5g梦想!...
  13. 模糊聚类及matlab实现,模糊聚类分析及matlab程序实现
  14. 真假内推?直拿offer?别被无良中介给骗了
  15. 记一次 打包报错:Keystore was tampered with, or password was incorrect
  16. MFC9.0 Outlook控件的标题显示无法修改
  17. 在FreeBSD下安装subversion
  18. destoon7.0火车头免登陆发布接口 destoon模拟人工发布接口 destoon火车头免费采集接口
  19. 简约时间地图图表合集PPT模板
  20. 凸度(bulge)是AutoCAD 中独有的概念

热门文章

  1. storm 机器上日志查询_Storm原理与实践大数据技术栈14
  2. python 爬虫 标签文本beautifullsoup_【Python爬虫】学习BeautifulSoup
  3. java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...
  4. php foreach 符号,关于php:php-foreach循环中变量之前的符号
  5. 电子设计竞赛(三)-SPWM与PID
  6. 3.0的USB,我们都用错了。
  7. arm rtx教程_ARM RTX操作系统—Overview—Product Description
  8. dict取值_Python基础数据类型「list、tuple、dict」
  9. 我的世界java手机版怎么调按键_如何在10秒内,让我的世界立即“自爆”?一个隐藏的mc快捷键...
  10. mysql innodb启动失败_mysql启动失败