colorful

zc qq:1337220912

 

cocos2d-x-2.2.2 android开发环境

一、准备
1. adt-bundle(包括了eclipse+sdk)
2. ndk: r9版本以上, 无需安装cygwin,新版本ndk不再依赖该编译环境
3. cocos2d-x-2.2.2
4. jdk

二  安装
1 安装jdk,配置java环境
JAVA_HOME:D:\Andorid\Java\jdk1.7.0_25(安装路径)
CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
运行 java -version
     javac
检测是否安装成功

2 解压cocos2dx, 安装cocos2dx, cmd到cocos2dx目录下,运行build-win32.bat

3 配置 eclipse
  打开eclipse,点击window->perfernces->Android,
  在SDK Location中填上刚刚下的adt-bundle解压后的D:\Andorid\adt\sdk
  window->perfernces->Android->NDK中填ndk路径 D:\Andorid\android-ndk-r9(自己的解压路径)
 
导入android项目
 项目属性->c/c++ build->Builder Settings->Bild command:填写ndk路径\ndk-build.cmd
 项目属性->c/c++ build->Environment 添加变量 NDK_MODULE_PATH    cocos2dx目录;cocos2dx目录\cocos2dx\platform\third_party\android\prebuilt

posted @ 2014-07-24 17:55 多彩人生 阅读(302) | 评论 (0)编辑 收藏

jdk与jre的区别

http://www.cnblogs.com/myitm/archive/2011/05/03/2035942.html

很多程序员已经干了一段时间java了依然不明白jdk与jre的区别。
JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。
如 果安装了JDK,会发同你的电脑有两套JRE,一套位于 \jre 另外一套位于 C:\Program Files\Java\jre1.5.0_15 目录下,后面这套比前面那套少了Server端的Java虚拟机,不过直接将前面那套的Server端Java虚拟机复制过来就行了。而且在安装JDK可 以选择是否安装这个位于 C:\Program Files\Java 目录下的JRE。如果你只安装JRE,而不是JDK,那么只会在 C:\Program Files\Java 目录下安装唯一的一套JRE。
JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要 操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE, 那么你可以想象你的电脑有两台虚拟的Java PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Java应用程序。
1、为什么Sun要让JDK安装两套相同的JRE?
这 是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 \lib\tools.jar 里。从下面例子可以看出,先将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 这个意思是说,你输入javac.exe与输入 java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main 是一样的,会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。 而且可以发现\lib目录下的程序都很小,不大于2 9K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程 序,也必须要自行附一套JRE才行,所以位于C:\Program Files\Java目录下的那套JRE就是用来运行一般Java程序用的。
2、如果一台电脑安装两套以上的JRE,谁来决定呢?
这 个重大任务就落在java.exe身上。Java.exe的工作就是找到合适的JRE来运行Java程序。 Java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。

ADD:(小小结)
1.JVM -- java virtual machineJVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文 件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系 统执行。2.JRE -- java runtime environmentJRE是指java运行环境。光有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库 lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需 要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就 可以运行你写程序了。(jre里有运行.class的java.exe)3.JDK -- java development kitJDK是java开发工具包,基本上每个学java的人都会先在机器上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录。在目录 下面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的是以下四个文件夹:bin、include、 lib、 jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包含JVM。bin:最主要的是编译器 (javac.exe)include:java和JVM交互用的头文件lib:类库jre:java运行环境(注意:这里的bin、lib文件夹和 jre里的bin、lib是不同的)总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。
eclipse、idea等其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你选中jre路径就ok了。

posted @ 2014-07-24 17:53 多彩人生 阅读(224) | 评论 (0)编辑 收藏

无名

一直在看校友群,却不知道该说什么.
长大了一点也不好,不能像小时候那样说话了

posted @ 2014-06-30 14:17 多彩人生 阅读(273) | 评论 (1)编辑 收藏

适者生存

有一个好成绩不难,因为有老师给你指路,因为问题有标准答案. 而当你走上了社会,你会发现,没有人再给你指路,也没有人能给你指路,很多很多都是自己一次次尝试,一次次失败摸出来的. 这个社会更没有标准答案, 大自然的生存法则就是适者生存,也就是强者生, 有说对错吗? 你适了,你强了,你就对了

posted @ 2014-06-14 15:02 多彩人生 阅读(132) | 评论 (0)编辑 收藏

自定义路径创建Cocos2d-x项目

http://www.cnblogs.com/skynet/archive/2013/11/17/3428369.html


--------------------------------------------------

自定义路径创建Cocos2d-x项目

本文介绍windows下面如何优雅的创建Cocos2d-x项目。为何称之为优雅,是因为现在网上流传的一些创建方法有一些问题。大致内容如下:

使用VS向导创建Cocos2d-x项目(废弃,不建议使用)

使用create_project.py

问题1:工程名等替换不完全

问题2:创建项目不能指定路径

使用VS向导创建Cocos2d-x项目(废弃,不建议使用)

Cocos2d-x 2.1.3及之前官方使用“install-template-msvc.bat”文件,安装VS创建Cocos2d-x项目向导,然后可以按照向导创建Cocos2d-x项目。注意默认情况下,新建项目的存放的位置应该设置在Cocos2d-x引擎的安装目录下面,否则可能因为找不到库文件而不能通过编译。不过可以在设置项目属性,头文件和库文件的搜索路径来解决。可以参考我之前的一篇博文《C++静态库与动态库》,里面介绍如何设置vs项目属性使用静态库和动态库。

Cocos2d-x 2.1.4,官方建议使用“create_project.py”来创建Cocos2d-x项目,并将在版本废弃了“install-template-msvc.bat”

We recommend you use multi-platform creating tools named create_project.py, which lies in tools/project-creator, to create a new project. This tool can create a project has the same folder structure as HelloCpp. Other tools such as create-android-project.sh will be removed in future.

Note: VS template was deprecated in this release, please use 'tools/project-creator' instead.

——来自官网:http://goo.gl/yVAjMr

我入手Cocos2d-x的时候,刚发布Cocos2d-x 2.1.4,就被这个坑了。Cocos2d-x 2.1.4废弃了“install-template-msvc.bat”,但是下载压缩包里面又有,可恶的是不能用的,各种报错。同时网上流传的就是使用这种方法,让我绕了不少路。

使用create_project.py

create_project.pycocos2d-x/tools/project-creator/目录下)使用方法比较简单:

Usage: create_project.py -project PROJECT_NAME -package PACKAGE_NAME -language PROGRAMING_LANGUAGE

Options:

 -project   PROJECT_NAMEProject name, for example: MyGame

 -package   PACKAGE_NAMEPackage name, for example: com.MyCompany.MyAwesomeGame

 -language PROGRAMING_LANGUAGEMajor programing lanauge you want to used, should be [cpp | lua | javascript]

Sample 1: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame

Sample 2: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame –language javascript

注意:

官方建议python使用2.7.3

安装python之后需要设置环境变量,或者使用该脚本时指定python路径,如C:\python27\python.exe create_project.py …

使用该方法创建项目之后,项目位于cocos2d-x/projects目录下面。windows平台进入proj.win32,打开工程文件即可。

使用create_project.py创建项目的原理,即简单地将cocos2d-x\template目录下的三种语言模板multi-platform-cppmulti-platform-luamulti-platform-js复制到对应的新建工程目录下,然后用PROJECT_NAMEPACKAGE_NAME替换模板中的HelloCpp/ HelloLua/ HelloJavascript

问题1:工程名等替换不完全

下面是我用towergame做为工程名创建的lua项目,目录如下:

clip_image001[4]

虽然可以正常编译,但发现工程名未替换为towergame,这比较坑爹。一位日本开发者lettas已经有人提交了修复请求https://github.com/cocos2d/cocos2d-x/pull/3943,不过正式发布的版本中还没有修改。急着用可以去github checkout下来用。

问题2:创建项目不能指定路径

使用create_project.py不能自定义路径,必须放在cocos2d-x/projects目录下面,这个设定我认为非常不合理!这样将自己的项目放到cocos2d-x引擎目录中,不方便管理,即库与项目耦合到一起了,如果cocos2d-x升级也不方便。

比较合理的方案是:

cocos2d-x独立安装,这样对cocos2d-x升级也相对简单。

新建cocos2d-x项目独立于cocos2d-x安装路径。通过设置搜索或引用路径,让项目能够找到cocos2d-x安装路径。

幸运的是,完全可以做到这样。熟悉VS的同学应该知道,VS工程设置是支持环境变量的。通过下面的一些改造,可以让新建的cocos2d-x项目独立于cocos2d-x引擎目录:

1)     将通过create_project.py创建的项目剪切到你希望放置的目录;

2)     创建环境变量COCOS2DX_HOME,指向cocos2d-x安装目录;

3)     *.sln文件使用文本方式打开,将里面的所有相对路径“..\..\..”都替换为环境变量%COCOS2DX_HOME%,如“..\..\..\cocos2dx\proj.win32\cocos2d.vcxproj”替换为“%COCOS2DX_HOME%\cocos2dx\proj.win32\cocos2d.vcxproj”

4)     *.vcxproj文件使用文本方式打开,将里面debugrelease 2种模式下<AdditionalIncludeDirectories>节点定义的引用路径中包含”$(ProjectDir)..\..\..\”都替换为环境变量“$(COCOS2DX_HOME)\”;注意这里使用环境变量的方式与*.sln中不一样,是$(COCOS2DX_HOME)而非%COCOS2DX_HOME%

至此,大工告成!看下面的运行起来的vs工程:

clip_image003[4]

图中依赖的工程跟将新建的项目放在cocos2d-x/projects目录下面一样可以链接到。

上面的替换工作可以用文本的查找替换功能,可以轻松搞定。但是为了能够与create_project.py集成,我提供下面一段代码能够自动替换.sln.vcxproj文件中对于内容:

 #!/usr/bin/python   

复制代码
#-*- encoding:utf-8 -*-   

import sys, os

def checkOption():
    argLen = len(sys.argv)
    targetPath = "./"
    if argLen == 2:
        targetPath = sys.argv[1]
        if not targetPath.endswith("/"):
            targetPath += "/"
    return targetPath
    
def replaceCocos2dxPath(path):
    filelists = os.listdir(path)
    for item in filelists:
        suffix = (os.path.splitext(item))[1]
        print(suffix)
        if suffix == ".sln":
            print('replace "..\..\..\" with %COCOS2DX_HOME% in *.sln')
            #replace "..\..\..\" with %COCOS2DX_HOME% in *.sln 
            content = open(path + item, 'r').read().replace("..\\..\\..\\""%COCOS2DX_HOME%\\")
            file = open(path + item, 'w')
            file.write(content)
            file.close()
        if suffix == ".vcxproj":
            print('replace "$(ProjectDir)..\..\..\" with $(COCOS2DX_HOME)\ in *.vcxproj')
            #replace "$(ProjectDir)..\..\..\" with $(COCOS2DX_HOME)\ in *.vcxproj
            content = open(path + item, 'r').read().replace("$(ProjectDir)..\\..\\..\\""$(COCOS2DX_HOME)\\")
            file = open(path + item, 'w')
            file.write(content)
            file.close()

if  __name__ == '__main__':
    targetPath = checkOption()
    replaceCocos2dxPath(targetPath)
复制代码

posted @ 2014-06-04 16:09 多彩人生 阅读(683) | 评论 (0)编辑 收藏

vs2012查找功能失效

VS"Find in Files"失效的解决方法一:
让VS窗口获得焦点,依次按以下快捷键
Ctrl+Break
Ctrl+Scroll Lock
Alt+Break


VS"Find in Files"失效的解决方法二:
在注册表中删除"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Find"后重启VS.

posted @ 2014-05-14 17:02 多彩人生 阅读(1209) | 评论 (0)编辑 收藏

vim 小盒子

---------------------------------------------------------------
 gvim 不生成备份文件
 set nobackup

---------------------------------------------------------------

posted @ 2014-03-26 16:22 多彩人生 阅读(349) | 评论 (0)编辑 收藏

中兴光猫超级用户破解

打开putty工具(百度就可找到), 点击session,输入IP ,端口23,选着Telnet 点击Open, 输入用户名root 密码 Zte521 (密码一般为“root”、“Zte521”、“telecomadmin”等), 进入后输入sendcmd 1 DB p DevAuthInfo 就可得到telecomadmin超级用户的密码 我的是F612, 密码放在DevAuthInfo表里,一般光猫是放UserInfo表里 运行sendcmd有2种方法: 1.telnet直接运行shell的命令。 2.浏览器访问http://192.168.1.1/web_shell_cmd.gch 简单说明:(基本语法) 1.读取全部表名:sendcmd 1 DB all 输出所有的表名,我这个光猫大概有200多个表。具体设置在哪里改,需要自己慢慢研究。 2.读取指定表详细信息: sendcmd 1 DB p 表名 比如sendcmd 1 DB p UserInfo,查看路由器帐号和密码,超级密码也在这里查看,如下图 2013年01月22日 - 焉逢 - 流年 3.查看当前系统运行的服务状态:sendcmd -pc show 4.修改某个表的某个字段的值:sendcmd 1 DB set 表名 行数 字段名 字段值 比如你要修改上面的那个超级密码:sendcmd 1 DB set UserInfo 0 Password 123456 要修改上面的那个用户密码:sendcmd 1 DB set UserInfo 1 Password 123456就是修改普通户名密码为123456 行数就是 这个里面No的值,这里是0,下面用户的行数那么行数就是1 字段名就是DM name后面引号中的名称,注意大小写。 字段值就是要设置的值 5.保存对配置文件的修改:sendcmd 1 DB save 不保存也是可以的,最好保存下。

posted @ 2014-03-23 17:35 多彩人生 阅读(10985) | 评论 (0)编辑 收藏

关于定时器

http://www.iwms.net/n1251c13.aspx

定时器是个很有意思的东西,它很有用,但我认为这不是现代计算机的结构所擅长的事情。
计算机适合做那些很大量的简单重复工作,或者根据请求做出回应。

DOS时代是没有进程线程等概念的,那时候要想做到定时真是有些麻烦
通常的做法是死循环不断监测时间,发现时间到了就做特定的事情
当然你可以用delay,来指定等待多长时间,但是如果你一边要响应用户的操作,比如输入,一边要定时做些
事情就是一件麻烦的事了

当然有些人可以这样做,截取系统的时钟中断(我忘了中断号是多少了),每秒钟有18.2次
当这些做法都不是很优雅。但DOS时代只能这样凑合着了

Windows是个伟大的进步,系统提供了Timer支持,但是问题是这个定时器并不准时而且有时候根本不能用。

Win32 API中有个SetTimer函数,可以为一个窗口创建一个定时器,这个定时器会定时产生消息WM_TIMER也可以调用
指定的回调函数,其实这都是一样的,因为都是单线程的。

单线程的定时器会有很多问题,首先是不准时,定时器只是定时把消息WM_TIMER访到线程的消息队列里,但是并不保证消息会立刻被响应,如果
碰巧系统比较忙,那么消息可能会在队列里放一端时间才被响应,还会造成本来应该间隔一段时间发生的消息响应连续发生了

解决方法通常是

OnTimer(...)
{
 //Timer process.....
 
 MSG msg;
 While(PeekMessage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE));
}
在当前Timer处理中,把消息队列里的WM_TIMER消息,清除掉。

更糟的是如果你不去调用GetMessage,那么就不会有Timer发生了。
这个问题直到win xp都没什么改变,似乎微软并不打算在Win32 API中解决这个问题了。

.NET Framework为我们带来了新的解决方案

.NET Framework提供三种Timer

Server Timers        System.Timers.Timer
Thread Timers       System.Threading.Timer
Windows Timers   System.Windows.Forms.Timer

其中Windows Timers只是提供了和WinAPI 一样的Timer,仍然是基于消息,仍然是单线程

其它两个就不同了,他们是基于线程池的Thread Pool,这样最大的好处在于,产生的时间间隔准确均匀。
Server Timers  和 Thread Timers 的不同在于ServerTimers 是基于事件的,Thread Timers是基于回调函数

我更喜欢Thread Timer,比较轻量级方便易用。

但是这样的Timer也有问题,就是由于时多线程定时器,就会出现如果一个Timer处理没有完成,到了时间下一个
照样会发生,这就会导致重入问题

对付重入问题通常的办法是加锁,但是对于 Timer却不能简单的这样做,你需要评估一下

首先Timer处理里本来就不应该做太需要时间的事情,或者花费时间无法估计的事情,比同远方的服务器建立一个网络连接,这样的做法尽量避免

如果实在无法避免,那么要评估Timer处理超时是否经常发生,如果是很少出现,那么可以用lock(Object)的方法来防止重入
如果这种情况经常出现呢?那就要用另外的方法来防止重入了

我们可以设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃执行

static  int inTimer = 0;
public static void threadTimerCallback(Object obj)
{
     if ( inTiemr == 0 )
    {
         inTimer = 1;         

         Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
         Thread.Sleep(2000);

         inTimer = 0;
      }
}

但是在多线程下给inTimer赋值不够安全,还好Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法

 static int inTimer = 0;
 public static void threadTimerCallback(Object obj)
 {
       if ( Interlocked.Exchange(ref inTimer, 1) == 0 )
      {
           Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
           Thread.Sleep(250);

           Interlocked.Exchange(ref inTimer, 0);
      }
 }

posted @ 2013-12-18 19:29 多彩人生 阅读(363) | 评论 (0)编辑 收藏

libcurl 多线程使用注意事项

1、问题来源,多线程使用Libcurl导致程序跑一段时间后自己退出,没有明显的异常。找不到合适的BUG。

 

最后通过查看资料和网上找的一些文章,发现,原来是信号处理的问题:

 

 

CURLOPT_NOSIGNAL


Pass a long. If it is 1, libcurl will not use any functions that install signal handlers or any functions that cause signals to be sent to the process. This option is mainly here to allow multi-threaded unix applications to still set/use all timeout options etc, without risking getting signals. (Added in 7.10)

If this option is set and libcurl has been built with the standard name resolver, timeouts will not occur while the name resolve takes place. Consider building libcurl with c-ares support to enable asynchronous DNS lookups, which enables nice timeouts for name resolves without signals.

Setting CURLOPT_NOSIGNAL to 1 makes libcurl NOT ask the system to ignore SIGPIPE signals, which otherwise are sent by the system when trying to send data to a socket which is closed in the other end. libcurl makes an effort to never cause such SIGPIPEs to trigger, but some operating systems have no way to avoid them and even on those that have there are some corner cases when they may still happen, contrary to our desire. 

 

就是当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。

 

所以,在使用的时候把这个选项设置成1就可以了.

curl_setopt(curl, CURLOPT_NOSIGNAL, 1L);

 

2、关于libcurl库的初始化和关闭:curl_global_init()和curl_global_cleanup()

这两个函数并不是线程安全的。所以只能在主线程中进行一次的初始化和清除。

虽然这个不是一定就会有问题,但是如果不这样处理还是有概率发生的。

posted @ 2013-12-02 17:16 多彩人生 阅读(1543) | 评论 (0)编辑 收藏

仅列出标题
共25页: 1 2 3 4 5 6 7 8 9 Last 

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜