cannot use ‘throw’ with exceptions disabled

cannot use ‘throw’ with exceptions disabled

在为 DragonBonesCPP/refactoring 的 cocos2d-x-3.2 demo 增加 Android 编译时,NDK 报了一个编译错误:

error: cannot use ‘throw’ with exceptions disabled
throw std::invalid_argument(“Invalid data.”);

这是由于 DragonBonesCPP 库使用了 C++ 标准异常,而 Android NDK 编译器默认不支持 C++ 异常控制导致。

但是,从Android NDK r5 版本开始,NDK 就开始支持 C++ 异常控制了,我的版本是 r9d ,为什么还会出现这个错误呢?

原来,NDK 编译器的 C++ 异常控制特性支持默认是关闭的。要打开它,可以这样做: 继续阅读cannot use ‘throw’ with exceptions disabled

IBM developerWorks 线程文章汇总

IBM developerWorks 线程文章汇总

最早我在 POSIX線程(pthread)入門文章分享 看到了关于 IBM developerWorks 中线程文章的一些汇总。但是按照该文中提供的链接一一找去,发现均不能访问。

原来 IBM developerWorks 对目录结构进行了修改,因此原来的链接就都作废了。

由于找不到 IBM developerWorks 中的相关汇总页面,我就人肉汇总了一次。

原文中只有 C 和 C++ 部分的内容,我又加入了 Python 和 HTML5 的内容。

下文的繁体字内容来自 POSIX線程(pthread)入門文章分享继续阅读IBM developerWorks 线程文章汇总

DragonBones 官方C++版本 for cocos2d-x

DragonBones 官方C++版本 for cocos2d-x

DragonBonesCPP for cocos2d-x

DragonBones 和 CCArmature

DragonBones 是一套骨骼动画工具集,最早使用 Flash 和 ActionScript 3.0 语言开发,主要在 Flash 游戏中使用,目前在页游和手游项目中使用很广泛。

DragonBones 目前包含下面这些内容:

  1. 基于 Flash IDE 中时间轴动画的编辑工具(美术GGMM的最爱);
  2. 基于 Flash IDE 插件的骨骼动画设计面板 DesignPanel
  3. 基于 ActionScript 3.0 的骨骼动画解析库和渲染库
  4. 基于 Javascript 的骨骼动画解析库和渲染库
  5. 基于 Unity3D C# 脚本的骨骼动画解析库和渲染库
  6. 基于 LoomScript 的骨骼动画解析库和渲染库

详细的入门介绍可以看这里: 继续阅读DragonBones 官方C++版本 for cocos2d-x

如何学习 cocos2d-x ?

如何学习 cocos2d-x ?

How to study cocos2d-x?

这是我在之乎上的一个回答,原文在这里(有修改):如何学习一种开发框架(如:手机开发cocos2dx方向)?

刚巧我也是从AS3转到了cocos2d-x,说说我的经验吧。

一、 cocos2d-x 部分

1.1 技术选型

从第三个手游开始,我实在被Adobe的ANE和国内的小平台折腾得没了脾气,决定转到cocos2d-x。在选择哪种语言绑定的时候纠结了很久,最后力排众议选了 lua:Cocos2d-x script language binding:Lua or Javascript? 。cocos2d-x 2.x 的lua绑定做得并不好,于是我选择了 quick-cocos2d-x继续阅读如何学习 cocos2d-x ?

quick-cocos2d-x中的绘图API

quick-cocos2d-x中的绘图API

quick-cocos2d-x 提供的绘图API的相关C++文件位于 draw_nodes 文件夹中,有这样几个:

CCDrawingPrimitives

提供 ccDraw* 开头的全局方法,可用来绘制游戏开发中调试用的图形。cocos2d-x开发组在该功能源码前使用了这样的说明:

LEGACY FUNCTIONS
USE CCDrawNode instead

在ccDrawCubicBezier下面还有这样的说明: 继续阅读quick-cocos2d-x中的绘图API

BUG?AIR打包的iOS程序在整数比较上的问题

BUG?AIR打包的iOS程序在整数比较上的问题

以前找到过一个 FlashPlayer在执行NetStream.play的时候崩溃的BUG ,没想到今天又让我碰到一个AIR的BUG。

和上个BUG不同,这个BUG再现起来相当容易,但我还是找了1天才找到再现的方式。

不说了,直接上代码:

package
{
import flash.display.Sprite;
import flash.filesystem.File;
import flash.text.TextField;

/**
 * 测试在iOS分发包中的unit与int不能比较的问题
 */
public class IOSUintTest extends Sprite
{
    public function IOSUintTest()
    {
        super();
        init();
        showInfo(-1 <= ZERO_INT);
        showInfo(-1 <= ZERO_UINT);
        showInfo(_num <= ZERO_INT);
        showInfo(_num <= ZERO_UINT);
    }

    private var _tf:TextField;

    private var _num:int = -1;

    public static const ZERO_INT:int = 0;

    public static const ZERO_UINT:uint = 0;

    private function init():void
    {
        _tf = new TextField();
        _tf.width = 400;
        _tf.height = 400;
        this.addChild(_tf);
    }

    private function showInfo($info:*):void
    {
        _tf.appendText(String($info) + File.lineEnding);
    }
}
}

地球人都知道,showInfo中的4个比较表达式的值应该都为true。恩,是的,在adb提供的调试版ipa中,它们的值都是true。

但是,在用于发布的ipa中,它们的值并非都是true!

我这里所说的“用于发布的ipa”,如果用Adobe的话来说,就是“限制分发的临时包”和“部署到Apple App Store的最终发行包“。

将这种包安装到iOS设备上,得到的4个值分别是 true,false,true,false

问题出在int与uint的比较上。因为AIR打包成ipa,实际上是直接将AIR程序打包成2进制代码,而不是采取虚拟机的形式(APK是采取的这种形式)。因此,使用AIR制作的ipa,理论上与使用Objective-C写的ipa没有什么不同。这也是为什么AIR写的ipa能堂而皇之的登上App Store的原因。否则,以苹果那个独裁政策,不卡死Adobe才怪!

既然是Objective-C代码,那么Objective-C的类型转换规则也同样适用与这个比较表达式。在Objective-C中,将int与uint互相比较的时候,会先将int转换成uint,得到4294967294,(4294967294 <= 0) 的值应为false。

Objective-C是基于C语言的。在C语言中,这种情况叫做整型提升。

以下摘自《The C Programming Language》

A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion.

在ActionScript中,int与uint比较的时候,是不会进行整型提升的。int和uint都是基于Number,在AVM中,我不知道它们是否进行了严格的划分。

从这个观点上说,这并不是BUG,而是不同语言的特性所致。但是,Adobe既然在大力推广AIR开发iOS应用,就要考虑到不同语言之间的差别,避免出现这种容易被忽视的错误。

这个BUG说起来简单,但是在一个已经存在的大型项目中发现这样的小错误,还是非常困难的。

困难的关键点在于,允许调试的ipa文件(target ipa-debug)中,并不会出现整型提升的问题。这就导致调试的时候正常的程序,在发布的时候不正常。何况发布的文件还无法调试!这绝对是Adobe的工作失误。

这个问题,我不准备报告给Adobe了。大家在开发中养成更严谨的习惯吧。

使用gcc -mno-cygwin参数编译失败的解决办法

网上绝大多数教程讲到使用gcc编译编译不依赖cygwin1.dll的应用程序时,需要加入-mno-cygwin参数。但这个方法已经不奏效了。

在cygwin下使用gcc 4.5.3版本编译时,加入-mno-cygwin参数后,gcc提示下面的信息:

gcc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler.

那么,去哪里找这个cross-compiler呢?

它就在/bin/下,32位的文件名为:i686-pc-cygwin-gcc-4.exe

如果需要64位的编译器,可以使用:x86_64-w64-mingw32-gcc.exe

在Dev-C++中无法将C源码编译成exe,提示“源文件未编译”的解决办法

今天下载了一堆C的书籍,准备深入学习一下。却发现这些书里面都没有讲解如何配置学习环境。无奈又google了一堆资料,选择了Dev-C++这个IDE,敲了Hello World代码,默认保存成C++源码(扩展名cpp),编译运行均正常。可是如果将其保存为C源码(扩展名c),在编译的时候,虽然也没有任何出错提示,但是却无法找到编译出来的exe文件。
下面是解决步骤: 继续阅读在Dev-C++中无法将C源码编译成exe,提示“源文件未编译”的解决办法