Error

C++博客 首页 新随笔 联系 聚合 管理
  212 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

2017年4月17日 #

1.bugly sdk整个目录拷贝到cocos_sdk/external
2.在项目中将bugly_sdk/agent/android/*.jar;bugly_sdk/android/*.jar拷贝到项目libs目录.!!!记得要添加到java的Referenced Libraries否则是不生效的。
  当前需要加入进来的是两个jar包,一个sdk的一个插件的
3.在项目中将bugly_sdk/android/*.so拷贝到项目的jni/prebuilt
4.Android.mk文件调整:
#集成libBugly.so,添加在LOCAL_PATH := $(call my-dir)
LOCAL_MODULE := bugly_native_prebuilt
LOCAL_SRC_FILES := prebuilt/$(TARGET_ARCH_ABI)/libBugly.so
include $(PREBUILT_SHARED_LIBRARY)
#引用bugly/Android.mk定义的Module,在LOCAL_STATIC_LIBRARIES := xxx之后
LOCAL_STATIC_LIBRARIES += bugly_crashreport_cocos_static
#添加在末尾
$(call import-module, external/bugly)
5.编辑AndroidManifest.xml添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
6.初始化
在AppDelegate::applicationDidFinishLaunching()接口调用CrashReport::initCrashReport(addId, debug)
7.实际测试添加完成后大概半小时后生效
posted @ 2017-04-17 19:51 Enic 阅读(5) | 评论 (0)编辑 收藏

2017年4月16日 #

// plsit测试
cc.log("begin test plist");
cc.spriteFrameCache.addSpriteFrames("res/hall_entrance.plist");
//var imageView = new ccui.ImageView("#hall_enter_3.png");  错误用法,js里边需要通过ccui.Widget.PLIST_TEXTURE参数明确指定
var imageView = new ccui.ImageView("hall_enter_3.png", ccui.Widget.PLIST_TEXTURE);
this.addChild(imageView);




ccui使用:
在project.json中的modules属性修改为:"modules" : ["cocos2d","extensions"],
posted @ 2017-04-16 23:54 Enic 阅读(3) | 评论 (0)编辑 收藏

2017年4月11日 #

Q1:怎么输出日志
A1:cc.log();
Q2: 日志怎么格式化输出
A2:cc.log("%d-%s", 123321, 'abc'); 目测和C类似,估计和console.log也类似,应该基础的js书里边就有,改天专门研究
Q3:为什么获取到的Button、Sprite等控件的contentSize是(0, 0)
A3: 应为没有在resource.js中添加,添加以后就能成功获取到size,表现和native一样了。猜测可能是在图片加载的时候做了预处理。
posted @ 2017-04-11 23:36 Enic 阅读(5) | 评论 (0)编辑 收藏

2017年4月4日 #

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <cstdarg>
#include <vector>

// 变参函数例子
// 中不包含类型信息,不包含数量信息。相对优雅的解决方式有两个:
// 1.类似printf的方式,通过fmt字符串解决
// 2.类似cocos::Sequence::create的方式,应为全部是动画指针,所以类型是约定好的统一类型,结束标记可以使用NULL标记
void ParametListTest(int nStart, )
{
    // 定义一个参数列表,用于接收解析""
    va_list parametList;

    // 输出第一个参数
    std::cout << nStart << std::endl;

    // nStart是‘’之前最后一个函数参数,用于内存定位,获取parametList
    va_start(parametList, nStart);

    // 里边的具体参数个数是获取不到的
    
// printf的处理和这里不一样:printf根据fmt字符串中的"%"标记来萃取参数类型、数量

    int nTem = 0;
    // 重parametList获取下一个类型为int的变量
    nTem = va_arg(parametList, int);

    // -1作为结束标记
    while (-1 != nTem)
    {
        std::cout << nTem << std::endl;

        nTem = va_arg(parametList, int);
    }

    va_end(parametList);
}


// 模版参数最后一个递归(带重载的递归)
void TParametListTest()
{
}

// C++ 1x变参模版
template<typename T, typename  Args>
void TParametListTest(T nStart, Args  args)
{
    std::cout << nStart << std::endl;

    // 可以直接展开多参数的定义
    
// 递归一次参数减少一个,最后会调用void重载
    TParametListTest(args);
}





int main()
{
    // 假设需要实现的功能是输出,这个demo已经满足条件
    
// 假设需要实现的是类似cocos的时序动画功能,其实把std::cout换成成员变量,或者某个全局函数即可实现

    ParametListTest(1, 2, 3, 3, 3, 3, -1);
    std::cout << "----------------------------" << std::endl;
    TParametListTest(1, 2, 3, 3, 3, 3);  // 采用1X可变模版参数语法实现的,可以抹掉末尾的结束标记

    return 0;
}
posted @ 2017-04-04 13:11 Enic 阅读(25) | 评论 (0)编辑 收藏

2017年4月1日 #

#filename: boost-1-60-0\tools\build\src\user-config.jam
#b2.exe toolset=gcc-ndk4.8 --without-math link=static runtime-link=static target-os=linux --stagedir=android
#bjam.exe toolset=gcc-ndk4.8 --without-math link=static runtime-link=static target-os=android --stagedir=android
import os ;  
   
if [ os.name ] = CYGWIN || [ os.name ] = NT {  
androidPlatform = windows-x86_64 ;  
}  
else if [ os.name ] = LINUX {  
androidPlatform = linux-x86_64 ;  
}  
else if [ os.name ] = MACOSX {  
androidPlatform = darwin-x86 ;  
}  
   
modules.poke : NO_BZIP2 : 1 ;  
ANDROID_NDK = D:/Cocos/android_ndk/android-ndk-r10d ;  
using gcc : ndk4.8 : 
$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.8/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-g++ :  
<archiver>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.8/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ar  
<ranlib>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.8/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ranlib  
<compileflags>--sysroot=$(ANDROID_NDK)/platforms/android-9/arch-arm  
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.8/include  
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/include  
<compileflags>-DNDEBUG  
<compileflags>-D__GLIBC__  
<compileflags>-DBOOST_FILESYSTEM_VERSION=3  
<compileflags>-lstdc++  
<compileflags>-lgnustl_shared  
<compileflags>-mthumb  
<compileflags>-fno-strict-aliasing  
<compileflags>-std=c++11  
<compileflags>-O2  
;  
using gcc : ndk4.9 : 
$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.9/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-g++ :  
<archiver>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.9/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ar  
<ranlib>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.9/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ranlib  
<compileflags>--sysroot=$(ANDROID_NDK)/platforms/android-9/arch-arm  
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.9/include  
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include  
<compileflags>-DNDEBUG  
<compileflags>-D__GLIBC__  
<compileflags>-DBOOST_FILESYSTEM_VERSION=3  
<compileflags>-lstdc++  
<compileflags>-lgnustl_shared  
<compileflags>-mthumb  
<compileflags>-fno-strict-aliasing  
<compileflags>-std=c++11  
<compileflags>-O2  
;  
posted @ 2017-04-01 14:51 Enic 阅读(4) | 评论 (0)编辑 收藏

2017年3月31日 #

查看和设置ndk使用的gcc版本
设置toolchain的方法是在Application.mk中设置:
NDK_TOOLCHAIN_VERSION = 4.7
为了确认是否设置成功,在ndk-build调用时增加参数V=1。即 ndk-build V=1 ..其他参数..
结果会显示:
/Developer/sdks/Android-ndk-r8e/toolchains/arm-Linux-androideabi-4.7/prebuilt/darwin-x86_64/bin/arm-Linux-androideabi-g++ -MMD -MP -MF ....
posted @ 2017-03-31 19:32 Enic 阅读(3) | 评论 (0)编辑 收藏

2017年3月22日 #

// lambda_test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <functional>
// 利用rtii观察堆栈生命周期
class StackLifeTimeWatching
{
public:
StackLifeTimeWatching()
{
std::cout << __FUNCTION__ << std::endl;
}
~StackLifeTimeWatching()
{
std::cout << __FUNCTION__ << std::endl;
}
};
// 经验: 保存lambda表达式的变量被销毁后,该表达式对应的闭包会销毁。应该保证闭包在lambda表达式变量的生命周期之内执行,否则程序执行结果不可预知!
// 1.理解lambda首先要理解函数对象,和闭包
// 2.理解必包的基础上,理解lambda如何实现闭包
// 3.理解闭包以后,需要分析设置不同的capture的情况下分别是如何实现闭包
//   1)闭包意味着一个函数地址 + 一组封装好的参数。
//   2)闭包可以被拷贝,但是每个闭包中的参数可以是不一样的
// 4.理解函数对象和lambda的关系: lambda可以理解成函数,但是当lambda赋值给一个函数对象的时候,编译器应该是把lambda构造成了一个闭包的function
//   1)根据汇编码分析,lambda对象类似于函数指针(但是类型系统和函数指针是完全不同的概念,可以用decltype(lambda)来鉴定),本质和函数对象是不一样的。
//   2)定义一个lambda表达式相当于定义一个函数(观察会变码,lambda表达式是没有构造和析构的)
//   3)把函数指针赋值给一个std::function,和吧lambda赋值给一个std::function的效果是完全不一样的。一个这是指针赋值操作,另一个则是完整的闭包。
//   4)经过代码实际测试,lambda是鉴于函数指针和函数对象之间的一个玩意,它也是一个特殊的类型,这个具体只能看C++标准文档了。
//   5)boost asio异步接口中的functor可能是利用了meta编程技巧,或者他本身每一次发起异步操作都会形成一个独立的闭包,解决了函数对象和socket对象生命周期绑定的关系
//      应为如果是functor实现,宿主对象析构,一定会造成作为成员变量的functor销毁,同时引起lambda闭包混乱(不仅闭包参数乱掉,闭包函数本身也呈现混乱)。
//      由此分析,闭包中的任何一行代码都必须在闭包本身的声明周期内执行。似乎可以理解成,lambda闭包是把lambda函数本身也当作一个特殊的参数来完成闭包封装的。
//      通过会变码观察,在使用不同的lambda变量调用lambda表达式的时候,会在ecx寄存器压入不同的值,然后会读取一块关联的内存。
//   6)vc2015下的lambda永远都是4字节,这应该是编译器实现细节了,按说应该是随着闭包内容的大小变化而变化。我猜测,这四个字节应该指向一个块内存,里边的数据是用来还原“lambda”函数执行栈的闭包
// 5.通俗的理解上述分析: lambda对象(变量)是一块内存,内存里边是lambda表达式本身的副本。当执行lambda表达式对象的时候,实际是执行对象对应的内存中的代码,如果对象被析构了,对应的代码也就是未知代码。
void Test1();
void Test2();
int main()
{
Test2();
    return 0;
}
void Test2()
{
int n = 0;
auto lambda = [&]()->void
{
StackLifeTimeWatching stackWatching;
n = 1;
int j = 0;
int j1 = 0;
int j2 = 0;
int j3 = 0;
int j4 = 0;
int j5 = 0;
};
decltype(&lambda) pLambda0 = &lambda;
decltype(&lambda) pLambda = NULL;
int nSize = sizeof(lambda);
{
decltype(lambda) lambda_copy = lambda;
lambda_copy();
}
(*pLambda0)();  // 正常掉用
(*pLambda)();  // 调用后整个闭包混乱
}
void Test1()
{
StackLifeTimeWatching p();
int n = 0;
std::function<void()> func;
std::function<void()>* pFunc = new std::function<void()>;
{
//std::function<void()> func = [&]()->void
//{
// StackLifeTimeWatching stackWatching;
// n = 1;
//};
//func();
auto lambda = [&]()->void
{
StackLifeTimeWatching stackWatching;
n = 1;
};
lambda();
func = lambda;
auto lambda2 = [&]()->void
{
delete pFunc;
pFunc = NULL;
StackLifeTimeWatching stackWatching;
n = 1;
};
//decltype(lambda) lambda_copy = lambda2; 编译错误,应为编译器会把每一个lambda表达式当作一个独立的类型,这是lambda不同于函数指针的地方,函数指针是根据参数来决定类型的
decltype(lambda) lambda_copy = lambda;
*pFunc = lambda2;
}
func();
(*pFunc)();
}
posted @ 2017-03-22 22:41 Enic 阅读(28) | 评论 (0)编辑 收藏

2017年3月19日 #

实现在CCGeometry.js
Point:
type: cc.Point(x,y)
help functon: 
cc.p(x,y)
cc.pointEqualToPoint(p1, p2)
cc.Size()
cc.size();
cc.sizeEqualToSize
cc.Rect()
cc.rect()
cc.rectEqualToRect()
cc._rectEqualToZero()
cc.rectContainsRect()
cc.rectGetMaxX
cc.rectGetMidX
cc.rectGetMinX
cc.rectGetMaxY
cc.rectGetMidY
cc.rectGetMinY
cc.rectContainsPoint
cc.rectIntersertsRect
cc.rectOverlapsRect
cc.rectUnion
cc.rectInterserction
// 可视区域
cc.visibleRect()


经过实际调试:
Point: 有x y属性可以直接使用
Size: width height
Rect: x y width height
posted @ 2017-03-19 10:54 Enic 阅读(9) | 评论 (0)编辑 收藏

2017年3月16日 #

1.创建的时候给明确地址和端口,创建完成后直接可以accept
2.open bind listen accept完整套路
posted @ 2017-03-16 21:56 Enic 阅读(6) | 评论 (0)编辑 收藏

1.直接close:客户端接收数据不完整,本地系统关闭socket,客户端收不到完整数据
2.shutdown_both:客户端接收数据不完整,end of file
3.shutdown_receive: 客户端接收数据完整
3.shutdown_send: 客户端接收数据不完整,远程主机关闭链接
关闭socket,但是确保对端一定收到数据的手段是:
1.shutdown_receive,同时在应用层确认全部数据已经投递到tcp堆栈,然后调用close
2.设计应用层关闭协议,由接收方主动关闭
posted @ 2017-03-16 21:54 Enic 阅读(3) | 评论 (0)编辑 收藏

仅列出标题  下一页