0

我正在将flashzlib集成到我的一个 flash 项目中。如项目文档中所述。我已成功生成 libz.a 和 zlbc 并将库和标头推送到适当的位置。

现在,我已经编写了这个小包装器https://gist.github.com/65d3c7ff683b326ecd22。这编译得很好:

gcc example1_as3.c -lz -O3 -Wall -swc -o example.swc

这包含在 Flash 项目中,如下所示(uncompressedData 是一个 byteArray):

private var loader:CLibInit = new CLibInit;
private var lib:Object = loader.init();
logger.info("B : " + lib.returnString(uncompressedData, uncompressedData.length) + "");

但闪存文件在最后一行失败。我不确定我错过了什么。zlbc 文件为 340KB,而 example.swc 仅为 80KB。

4

1 回答 1

1

它失败的原因有两个。要么 Alchemy 没有找到z.l.bc(也懒得告诉你),要么你没有正确捕获和报告你的错误代码。

正如我在问题评论中提到的,我在inflateInit调用时遇到了运行时错误。就我而言,事实证明 Alchemy 并没有像预期的那样$ALCHEMY_HOME/usr/local/lib搜索。z.l.bc这是通过将其移至/usr/local/lib来解决的。之后,您的代码Z_OK按预期返回。

我注意到您已将所有CHECK_ERR调用注释掉,这意味着如果您注释掉提前返回,您将进入无限循环,example.c:52因为您没有inflate在以下无条件for块中检查调用错误。对我来说,因为我只是为了测试目的而将一些 UTF 字节交给它,所以它inflate正在返回。Z_DATA_ERROR

说到测试,我注意到 flashzlib 提供了一个小型测试套件:

我借用了这段代码,重命名maintest_all,注释掉了对test_gzio¹ 的调用,并将所有printf调用替换fprintf为对而不是² 的调用stderr。这是结果:

zlib 版本 1.2.3 = 0x1230,编译标志 = 0x2000095

解压缩():你好,你好!

膨胀():你好,你好!

大膨胀():好的

在 inflateSync() 之后:你好,你好!

用字典膨胀:你好,你好!

0

一切似乎都井然有序。


脚注:
¹ 当然,Alchemy 中没有文件访问权限。
²stdout对我来说已断开连接,但stderr出现在我的跟踪控制台中

于 2011-11-11T05:16:39.677 回答