例子中的注释已经很详细了,我觉得逐行翻译一下,就完全可以体现出此例子的意义

#include <stdio.h>
#include <string.h>
#include "AS3/AS3.h"  //<-----大家注意这货,它提供了C++中调用AS3的方法

int main(int argc, char **argv)
{

/*

flascc使用GCC的inline asm语法来使你可以在C++编写和调用AS3代码。

想更详细地了解汇编规则,可以参考下面的内容

http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
       值得说明的是,在flascc里调用采用内联汇编的方式调用AS3,会有一些限制。

在内联汇编中,你不能够编写AS3类。但是,你可以编写C++类。

下面的汇编语句块声明了一个AS3变量,并且将它打印出来。因为这个汇编语句块并没使用这个变量。所以,这个变量必须被标记为volatile ,否则GCC会把它优化掉。并且,这个trace并不会出现在SWF的控制台中,trace的输出是在一个flashlog文件里。想知道如何开启一个trace的输出,可以参考这里

http://kb2.adobe.com/cps/403/kb403009.html

*/
    inline_as3(
        "var foo:int = 42;\n"
        "trace(\"This is inline AS3: \" + foo);\n"
        : :
    );

/*

汇编语句块允许你输入和输出参数。这样的话,我们就可以很容易地在两个语言间进行交互了。但是,并不是所有的C++类型都能够在AS3中找到对应的。可以参考下面的映射

C类型  AS3类型

int32    int

int64    需要特殊处理

float32 Number

double Number

pointer int

下面,我们来尝试将一个正数取反。

*/
    int someint = 123;
    int intresult = 0;
    inline_as3(
        "%0 = -%1;\n"
        : "=r"(intresult) : "r"(someint)
    );

//回到C语言环境时,我们可以打印这两个值。
    printf("-%d is %d\n", someint, intresult);

//使用AS3开方

double somenumber = 45.0;
    double result = 0.0;
    inline_as3(
        "%0 = Math.sqrt(%1);\n"
        : "=r"(result) : "r"(somenumber)
    );
    // 打印
    printf("sqrt of %f is %f\n", somenumber, result);

// 使用AS3对行64位整数相乘
    unsigned long long somelonglong = 0x243F6A8885A308D3ULL; // 64 fractional pi bits
    double piapprox = 0.0;

inline_as3(

//转换为uint是因为1%和2%在AS3中将会被表示为int
        "%0 = 3 + uint(%1) / 0x100000000 + uint(%2) / 0x10000000000000000\n"
        : "=r"(piapprox) : "r"((unsigned)(somelonglong >> 32)), "r"((unsigned)somelonglong));
    printf("pi approx is %.15f\n", piapprox);

//
    unsigned hi32, lo32;
    inline_as3(
        "%0 = uint(Math.sqrt(2) * 0x100000000); %1 = uint(Math.sqrt(2) * 0x10000000000000000)\n"
        : "=r"(hi32), "=r"(lo32));
    somelonglong = ((unsigned long long)hi32 << 32) | lo32;
    printf("52 fractional bits of sqrt(2): %llx\n", somelonglong); // only 52 bit mantissa in double!

/*处理C字符串的话,要麻烦一点。虽然它们不能够自动转换为AS3中的string对象,但是汇编语句块提供了一些帮助函数。

*/
    const char* words[] = {"flascc", "is", "awesome!"};
    int i;
    for(i=0; i<3; i++) {
        inline_as3(
            "trace(\"trace: \" + %0 +  \": \" + CModule.readString(%1, %2));\n"
            : : "r"(i), "r"(words[i]), "r"(strlen(words[i]))
        );
    }

/*那,我们再来看看,如何将一个AS3的string对象转给C/C++代码呢? 因为flascc使用ByteArray来存储,所以我们需要malloc()一些BypteArray的空间。并且复制字符串数据到里面。

mallocString帮助函数接受一个AS3 string对象并且会将它的一份拷贝放到flascc的堆上。这样的话,当用完以后,可以使用C中的free函数进行释放。

下面的代码还演示了两个汇编代码块之间的变量的可用性。

*/
    inline_as3("var as3words = ['Interop', 'is', 'easy!'];\n");
    char* wordptrs[] = {NULL, NULL, NULL};
    for(i=0; i<3; i++) {
        inline_as3(
            "var stringptr:int = CModule.mallocString(as3words[%0]);\n"
            "CModule.write32(%1, stringptr);\n"
            : : "r"(i), "r"(&wordptrs[i])
        );
    }
    for(i=0; i<3; i++) {
        printf(">>> %s\n", wordptrs[i]);
        free(wordptrs[i]);
    }
}

完了,可见,使用内联方式调用AS3代码,感觉是比较鸡肋的。 但由于目前对FLASCC了解得不够深入。 不作过多评价。

转载于:https://www.cnblogs.com/qilinzi/archive/2013/05/14/3077026.html

FlasCC例子研究之hellointerop相关推荐

  1. FlasCC例子研究之Animation

    上几个例子向我们展示了,如何在main()函数里用C++和AS3进行交互. 但是,如果我们想在C++中实现一些动画效果(循环播放的),怎么办呢? AS3是单线程的,所以,我们不可能说放一个while( ...

  2. FlasCC例子研究之Drawing补充

    这个例子是建立在上一个interop示例的基础上的,这个例子演示了一些更复杂的交互.(绘制到舞台). 这个例子由两个CPP文件组成,所以,可以去看它的makefile文件,看它们是如何用G++打包的( ...

  3. Mule 官方例子研究

    Mule 官方例子研究 一.编译导入Mule自带的例子 1.准备 安装Mule.这里就不介绍mule的安装了,请参考<Mule安装部署手册>. 2. 编译Mule自带例子中的Hello例子 ...

  4. linux mule,Mule 官方例子研究(2)

    Mule 官方例子研究(2) 日期:2011-10-28 点击:169 来源: 未知 分享至: exchange-pattern=\"request-response\"> ...

  5. hung-yi lee_p10_分类/概率生成模型

    文章目录 研究背景 本节目的 本节要使用的例子 研究过程 把分类当成回归来算 理想做法 找到最佳函数的方法 研究成果运用 运用过程 结果 方法改进 模型总结 讨论 为什么选择正态分布模型? 关于后验概 ...

  6. DeepMind让AI变身天才数学家!首次提出两大数学猜想,登Nature封面

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨新智元 编辑丨极市平台 导读 12月2日,DeepMind用A ...

  7. mockcpp的so加载失败问题

    mockcpp的so加载失败问题 一.先来看之前已解决的六个so无法加载的问题. 把libmockcpp-ut-TestReturnObjectList.so拿来做例子研究so加载问题. 加载成功时的 ...

  8. MIT自然语言处理第一讲:简介和概述(第二部分)

    自然语言处理:背景和概述 Natural Language Processing:Background and Overview 作者:Regina Barzilay(MIT,EECS Departm ...

  9. 代码质量评判标准、设计模式、面向对象设计原则速查表

    文章目录 代码质量评判标准 软件腐化的原因 提高系统可复用性的几点原则 可维护性与可复用性并不完全一致 面向对象设计原则 1. 面向对象设计的六大设计原则表 2. 图解面向对象涉及的六大原则 1. 开 ...

最新文章

  1. async/await的实质理解
  2. BLE-NRF51822教程4-串口BLE解析
  3. Linux环境源码编译安装SVN
  4. 王者荣耀赛季末上分很枯燥,可以找一个猎游陪练一起上分
  5. ON DUPLICATE KEY UPDATE 用法与说明
  6. 面试:Zookeeper
  7. 2017.4.23 一元三次方程求解 思考记录
  8. 吴恩达机器学习练习4:神经网络学习(损失函数和正则化)
  9. Mybatis trim 标签的 2 个妙用!
  10. python基于OpenCV模块实现视频流数据切割为图像帧数据
  11. 教你怎样打领带(附图)绝对实用哦!!!【实用】
  12. 手动安装virtualbox增强功能
  13. 夜深人静写算法(五)- 初等数论
  14. 正则表达式(regex,RE)
  15. halcon裁剪图像_【Halcon】Halcon学习之七:改变图像的现实方式和大小
  16. 基于(ztmap)BIM的数字孪生建造智慧机房管理后台展示系统
  17. ReferenceQueue、Reference详解
  18. 软件构造之抽象相关知识总结
  19. VIVADO+ZYNQ7000入门三,PS与PL的联合开发
  20. SD卡启动tiny4412标准版(1306)的linux系统并挂载网络根文件系统

热门文章

  1. java表格模糊查询_使用java图形报表时,如何进行模糊查询
  2. 完全背包问题python_令人头疼的背包九讲(2)完全背包问题
  3. 百度图神经网络学习——day01
  4. 训练中Loss为Nan的原因,梯度消失或者爆炸的优化
  5. 华为认证hcia含金量_【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)...
  6. kafka 不同分区文件存储_Kafka 系列(二)文件存储机制与Producer架构原理怎样保证数据可靠性??...
  7. java web相关试卷_JavaWeb试卷四
  8. [列联相关] 列联系数计算及假设检验
  9. JDK源码学习笔记——String
  10. 记录一些js面试题以及解法