- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想用 luajit 录制我屏幕的一小部分。
还没有找到任何模块。除了 http://luajit.org/ext_ffi.html 之外,网络上几乎没有任何关于 luajit 的 ffi 的文档/教程/示例。它没有提供任何使用其他 C 库的示例。
我有一个原生的 C 代码片段。您将如何为 luajit 的 ffi 实现 C 代码?
Luajit 示例代码:
--ffi part
local screen = {}
for y = 1, 100 do
for x = 1, 100 do
local r, g, b = ffi.C.getpixel(x, y)
table.insert(screen, r)
end
end
C 代码片段:
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
int main()
{
XColor c;
Display *d = XOpenDisplay((char *) NULL);
int x=1920/2; // Pixel x
int y=1080/2; // Pixel y
XImage *image;
image = XGetImage (d, XRootWindow (d, XDefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
c.pixel = XGetPixel (image, 0, 0);
XFree (image);
XQueryColor (d, XDefaultColormap(d, XDefaultScreen (d)), &c);
printf("%d %d %d\n", c.red/256, c.green/256, c.blue/256);
return 0;
}
最佳答案
基本上,您只需将 header 中的所有声明复制到 ffi.cdef
部分,然后通过库句柄调用这些名称。原则上,您可以一对一地翻译 C 代码,但获取变量地址除外。但是,这在您链接的 FFI 教程中有记录(http://luajit.org/ext_ffi_tutorial.html#idioms)
C code Lua code
Functions with outargs int len = x; local len = ffi.new("int[1]", x)
void foo(int *inoutlen); foo(&len); foo(len)
y = len; y = len[0]
这是您在 LuaJIT 中的 C 代码。我没有复制 Display
和 XImage
的定义,因为我们从不访问它们的成员,只使用指向它们的指针,所以它们保持不透明 struct
local ffi = assert(require("ffi"))
ffi.cdef[[
// Types from various headers
typedef struct _Display Display;
typedef struct _XImage XImage;
typedef struct {
unsigned long pixel;
unsigned short red, green, blue;
char flags; /* do_red, do_green, do_blue */
char pad;
} XColor; // Xlib.h
typedef unsigned long XID; // Xdefs.h
typedef XID Window; // X.h
typedef XID Drawable; // X.h
typedef XID Colormap; // X.h
// Functions from Xlib.h
Display *XOpenDisplay(
char* /* display_name */
);
int XDefaultScreen(
Display* /* display */
);
Window XRootWindow(
Display* /* display */,
int /* screen_number */
);
XImage *XGetImage(
Display* /* display */,
Drawable /* d */,
int /* x */,
int /* y */,
unsigned int /* width */,
unsigned int /* height */,
unsigned long /* plane_mask */,
int /* format */
);
int XFree(
void* /* data */
);
int XQueryColor(
Display* /* display */,
Colormap /* colormap */,
XColor* /* def_in_out */
);
Colormap XDefaultColormap(
Display* /* display */,
int /* screen_number */
);
// Functions from Xutil.h
unsigned long XGetPixel(
XImage *ximage,
int x, int y);
]]
local X11 = assert(ffi.load("X11"))
local AllPlanes = -1 -- Xlib.h: #define AllPlanes ((unsigned long)~0L)
local XYPixmap = 1 -- X.h: #define XYPixmap 1
local c = ffi.new("XColor[1]")
local d = X11.XOpenDisplay(ffi.NULL)
local x = 1920 / 2
local y = 1080 / 2
local image = X11.XGetImage(d, X11.XRootWindow(d, X11.XDefaultScreen(d)), x, y, 1, 1, AllPlanes, XYPixmap)
c[0].pixel = X11.XGetPixel(image, 0, 0)
X11.XFree(image)
X11.XQueryColor(d, X11.XDefaultColormap(d, X11.XDefaultScreen(d)), c)
print(string.format("%d %d %d", c[0].red/256, c[0].green/256, c[0].blue/256))
关于c - 如何为 luajit 的 ffi 实现 X11(返回屏幕像素的颜色)C 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53688777/
在 official guide 之后的一段时间里,我一直在尝试在 Windows 10 上安装 LuaJIT。 ,我实际上开始安装它。例如,如果我执行 luajit我进入提示。另外,luajit -
require "utils.lua" stdin:1: module 'utils.lua' not found: no field package.preload['utils.l
我正在尝试使用 setfenv 对一些函数进行沙盒处理,我收到以下输出: 123 nil 为什么调用sandboxTest()时testValue是nil,而在callSandboxedTest()中
只是来自“Lua 新手”的一个小问题......我一直在使用 LuaJIT,它很棒,没有问题是因为 LuaJIT 是 Lua 5.1 兼容的,这是否意味着我可以使用标准 Lua 在 LuaJIT 中使
教程部分中的示例:“为 C 类型定义元方法” 如下所示: local ffi = require("ffi") ffi.cdef[[ typedef struct { double x, y; } p
我想用 C 编写一些函数以在 Lua 中使用,我认为我能找到的最简单的方法是使用 LuaJIT 的 FFI。 我有一个 C 文件“add.c”: int add(int a, int b){ retu
我正在寻找有关如何为 LuaJIT 2 优化 Lua 代码的好指南.它应该关注 LJ2 的细节,比如如何检测哪些跟踪正在被编译,哪些不是,等等。 任何指针?收集到 Lua ML 帖子的链接可以作为答案
我正在尝试优化我的 LuaJIT 代码,我想知道是否有一个调试工具,或者我是否可以编写一个,来检查我的脚本访问全局变量/表/函数的次数? 最佳答案 您可以使用代理表来存储全局变量,并将对全局表的任何访
我有以下 qsort 示例来尝试 luajit 中的回调。但是它有内存泄漏(luajit:执行时内存不足),这对我来说并不明显。 有人可以给我一些关于如何创建正确的回调示例的提示吗? local ff
我在使用 ffi.metatype 定义的用户数据时遇到问题。当对象被垃圾收集时,我会遇到段错误。这是代码。 ffi = require("ffi") srate = 48000 ffi.cdef[[
关于 的 Luajit 手册-b 选项 说: The output file type is auto-detected from the extension of the output file n
我有一个小的 C 程序,它有一个字符串,它必须代表一个 Lua 模块,它看起来像这样: const char *lua_str = " local mymodule = {} \ functi
已关注 MSDN's GetOpenFileName example使用 LuaJIT 的 FFI。这两天我一直在努力让它工作,不仅对话框打不开,而且整个东西都崩溃了。 当使用 OllyDdb 进行调
我有这样的文件设置: main.lua (requires 'mydir.b' and then 'b') b.lua mydir/ b.so (LuaJIT C module) 从主要,
我认为 LuaJIT 很棒,现在我也看到了 eLua。 我很好奇嵌入式程序员什么时候会为嵌入式系统选择一个而不是另一个? 最佳答案 这取决于您所说的“嵌入式系统”是什么意思。您是指“移动应用程序”还是
lua -e "print(package.path)" ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib
编辑:不幸的是,LuaJIT 被排除在下面链接的比较之外。 这个comparison编程语言的多样性表明 LuaJIT 比普通 Lua 实现有十倍以上的改进。为什么变化这么大? Lua 是否有什么特殊
我目前正在尝试使用以下命令在我的 Arch linux 发行版上使用 luajit 支持编译 suricata ( http://suricata-ids.org/ ): ./configure --
LuaJIT 知道它定义的 C 类型以及数组的长度,但它不检查边界: ffi = require("ffi") ten_ints = ffi.typeof("int [10]") p1 = ten_i
我在 LuaJit 中不断收到内存不足错误。如何增加堆栈或堆大小? 谢谢 最佳答案 除了玩具示例,我自己没有使用过 LuaJIT。但是由于还没有其他人提供任何答案... 从浏览 documentati
我是一名优秀的程序员,十分优秀!