Luajit-FFI实战(C/C++)
2020.5.26 - 人鱼情未了
Luajit 演示版下载(点击查看教程):luajit-Demo.rar

windows API目录


luaffi.C API无需调用任何dll文件,luaffi可以使用Sleep,printf等C语言函数,说明里面声明了#include 库函数,windows库的API才能直接使用,导致文档更新慢的原因是我正在了解它有什么函数,我也正在学习它,你如果有兴趣研究可以查看windowsAPI目录函数库,然后研究如何在Luaffi里声明它,这是我目前在研究解决的问题,使用ffi.cdef去声明它里面所有函数,下面例子是目前已知的使用方法,可以参考,或许还会改进。
思考:既然win系统下的luajit自带win功能的API,那么我猜测,在安卓系统下它可能也是兼容了它的内部函数,有待研究。
C++扩展dll:我们后续会使用ffi.load来调用C++编译的dll动态库,加载#include 图像处理库,该库有人工智能算法API,图像处理API,可以来获取我们图片颜色,显示图片,处理图片等等功能,如果能把windows.h库所有函数都使用ffi.cdef去声明并成功在luajit运行,那么在其他库里面,我们将无所不能。

1 / 鼠标 API示例

获取鼠标当前坐标 GetCursorPos

  1. -- 调用FFI模块
  2. local ffi = require("ffi")
  3. -- 声明方法:需要用哪个函数,就把它写进ffi.cdef([[声明.h]])
  4. ffi.cdef([[
  5. //声明结构体,类型取名:tagPOINT,变量取名:POINT
  6. typedef struct tagPOINT
  7. {
  8. long x;
  9. long y;
  10. }POINT;
  11. //声明函数:没有返回值,形参:指针类型的tagPOINT结构体
  12. void GetCursorPos(struct tagPOINT*);
  13. ]])
  14. -- 通过变量POINT新建tagPOINT结构体,取名mouse
  15. local mouse = ffi.new("POINT")
  16. -- mouse转指针类型,p代表指针类型
  17. local mouse_p = ffi.cast('struct tagPOINT*', mouse)
  18. -- 调用windows函数获取鼠标当前坐标
  19. ffi.C.GetCursorPos(mouse_p)
  20. -- 打印当前鼠标位置坐标
  21. print(mouse.x, mouse.y)

**C++原型**
Luajit-FFI实战 - 图1

  1. #include <windows.h>
  2. #include <iostream>
  3. int main() {
  4. POINT mouse; //定义结构体POINT(windows.h自带结构体)
  5. GetCursorPos(&mouse); //放入指针从函数里取值
  6. std::cout << mouse.x << "," << mouse.y << std::endl; //打印数据
  7. return 0;
  8. }