尝试在 iPad 上为 Codea 加载第三方 lua 库

尝试在 iPad 上为 Codea 加载第三方 lua 库

概述

在别人的代码中学到一种方法, 可以通过 requireCodea 中直接加载 lua 库, 感觉很实用, 打算尝试着扩展一下, 看看能否加载用 c 编译出来的 .dylib 动态库和 .a 静态库.

加载 .lua 形式库的方式

简单介绍一下 lua 加载库的原理, 所谓的库其实就是一些被组织起来的 lua 代码, 为了方便项目管理, 把 lua 代码以库的形式编写. 那么加载一个库其实就是把这个库的代码执行一遍, 首先得找到这个库, lua 中有个约定, 使用这两个变量来指明库文件的路径:

  • lua库地址

    • package.path
  • c 库地址

    • package.cpath

有了上述知识背景, 我们就明白在 Codea 中加载库实际上就是指明库文件所在的位置, 假设我们的库文件是 mylib.lua 我们先把库文件放在一个 Codea 能够访问的位置, 比如 Codea 中的 DocumentsDropbox 下, 然后再在代码中指定这个位置.

一般而言, 如果是多个库文件, 那么我建议专门建一个目录放在 Dropbox, 因为它可以在外部批量操作, 如果只是少数几个库文件, 那么可以手动把它们加入 Documents 中.

具体代码如下:

lib = {}
home = os.getEnv("HOME")
lib.Documents = home.."/Documents"
lib.Dropbox = home.."/Dropbox.assats"

package.path = package.path..";"..lib.Dropbox

mt = require "mytest"

mt.foo()

这里可以打印一下, 看看我们的库放在哪里了:

print(package.path)

尝试加载动态库 dylib

接下来试验一下是否可以通过这种方式加载动态库, 如果可以的话就非常强大了, 我们可以把那些计算量较大的模块写成动态库, 再通过 Codea 中的 lua 来调用

先用 c 编译一个测试用的动态库, 代码如下:

#include <stdio.h>
#include "lauxlib.h"

void foo(lua_State* L)
{
  puts("Hello, I'm a shared library");
}

编译命令如下:

gcc -c -Wall -Werror -fpic foo.c -I/Users/admin/sourceCode/lua-5.3.3/src
gcc -shared -o libfoo.dylib foo.o
```	

我的环境的 `OSX`, 也可以用这个命令来生成库文件, 下面是静态库文件的生成:

libtool -static -o libfoo.a foo.o

接下来就是把生成的库文件 `libfoo.dylib` 和 `libfoo.a` 放到 `Codea` 中, 这次只能放在 `Dropbox` 中, 因为 `Documents` 放不进去.

然后执行跟上面类似的一段代码, 不过这次设置的是 `package.cpath`, 代码如下:

package.cpath = package.path..";"..lib.Dropbox

mt = require "mytest"

mt.foo()

非常遗憾的是, 运行报错了, 提示信息是:

Dynamic Libraries is not enable

至于 `libfoo.a` 就不必试了, 因为静态库是在编译时使用的, 而我们的 `Codea` 处于运行时.

后来查了一下, 发现 `iOS` 不允许把运行时编译好的代码放进内存执行, 只能以解释方式执行 `interpret`. 

##	参考

[Spine2D support for Codea](https://codea.io/talk/discussion/8174/spine2d-support-for-codea)   
[spine 官网](http://zh.esotericsoftware.com)
相关文章

相关标签/搜索