cocos2dx提供三方的iconv来转化字符问题,交叉编译到android的时候,需要引入iconv的module,下载iconv, https://dl.dropbox.com/u/99895284/iconv.zip 解压到cocos2d根目录 ,编写mk:
proto作为游戏中的传输协议一部分是相当的有用(注意将mk,config.h放在同一目录)。版本2.5.0
protobuf库:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := protobuf_static LOCAL_MODULE_FILENAME := libprotobuf LOCAL_CPPFLAGS += -fexceptions LOCAL_CPP_EXTENSION := .cc LOCAL_SRC_FILES := \ google/protobuf/io/zero_copy_stream_impl_lite.cc \ google/protobuf/io/zero_copy_stream_impl.cc \ google/protobuf/io/zero_copy_stream.cc \ google/protobuf/wire_format_lite.cc \ google/protobuf/wire_format.cc \ google/protobuf/unknown_field_set.cc \ google/protobuf/io/tokenizer.cc \ google/protobuf/text_format.cc \ google/protobuf/stubs/substitute.cc \ google/protobuf/stubs/strutil.cc \ google/protobuf/stubs/structurally_valid.cc \ google/protobuf/stubs/stringprintf.cc \ google/protobuf/service.cc \ google/protobuf/repeated_field.cc \ google/protobuf/reflection_ops.cc \ google/protobuf/io/printer.cc \ google/protobuf/compiler/parser.cc \ google/protobuf/stubs/once.cc \ google/protobuf/message_lite.cc \ google/protobuf/message.cc \ google/protobuf/compiler/importer.cc \ google/protobuf/io/gzip_stream.cc \ google/protobuf/generated_message_util.cc \ google/protobuf/generated_message_reflection.cc \ google/protobuf/extension_set_heavy.cc \ google/protobuf/extension_set.cc \ google/protobuf/dynamic_message.cc \ google/protobuf/descriptor_database.cc \ google/protobuf/descriptor.pb.cc \ google/protobuf/descriptor.cc \ google/protobuf/stubs/common.cc \ google/protobuf/io/coded_stream.cc \ google/protobuf/stubs/atomicops_internals_x86_msvc.cc LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) include $(BUILD_STATIC_LIBRARY)
iconv库:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_ARM_MODE := arm ifeq ($(BUILD_WITH_NEON),1) LOCAL_ARM_NEON := true endif LOCAL_MODULE := iconv LOCAL_CFLAGS += \ -DHAVE_CONFIG_H \ -DBUILDING_LIBICONV \ -DIN_LIBRARY # -DLIBICONV_PLUG LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/libcharset \ $(LOCAL_PATH)/lib \ $(LOCAL_PATH)/libcharset/include \ $(LOCAL_PATH)/srclib LOCAL_SRC_FILES := \ lib/iconv.c \ libcharset/lib/localcharset.c \ lib/relocatable.c LOCAL_STATIC_LIBRARIES += charset include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) include $(call all-makefiles-under,$(LOCAL_PATH))
android.mk jni中(windows平台 可以自动扫描提取文件夹以及子目录的c,cpp,cc等文件编译):
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILENAME := libcocos2dcpp # 遍历目录及子目录的函数 define walk $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e))) endef # 遍历Classes目录 ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes) FILE_LIST := hellocpp/main.cpp # 从所有文件中提取出所有%.cpp %.c %.cc文件 FILES_SUFFIX := %.cpp %.c %.cc FILE_LIST += $(filter ${FILES_SUFFIX}, $(ALLFILES)) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \ #add iconv from thrid part LOCAL_WHOLE_STATIC_LIBRARIES := iconv_static LOCAL_WHOLE_STATIC_LIBRARIES += protobuf_static LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static # LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static # LOCAL_WHOLE_STATIC_LIBRARIES += cocosbuilder_static # LOCAL_WHOLE_STATIC_LIBRARIES += spine_static # LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static # LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static # LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static include $(BUILD_SHARED_LIBRARY) $(call import-module,.) $(call import-module,audio/android) $(call import-module,libprotobuff) $(call import-module,iconv) # $(call import-module,Box2D) # $(call import-module,editor-support/cocosbuilder) # $(call import-module,editor-support/spine) # $(call import-module,editor-support/cocostudio) # $(call import-module,network) # $(call import-module,extensions)
编译成功运行
附上两个iconv的基本用法
//icove int Kit::code_convert( const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen ) { iconv_t cd; const char *temp = inbuf; const char **pin = &temp; char **pout = &outbuf; memset( outbuf, 0, outlen ); cd = iconv_open( to_charset, from_charset ); if(cd == 0) return -1; if(iconv( cd, pin, &inlen, pout, &outlen ) == -1) return -1; iconv_close( cd ); return 0; } /*UTF8 To GB2312*/ string Kit:: utf2gb( const char *inbuf ) { size_t inlen = strlen( inbuf ); char * outbuf = new char[inlen * 2 + 2]; string strRet; if(code_convert( "utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2 ) == 0) { strRet = outbuf; } delete[] outbuf; return strRet; } string Kit:: gb2utf8( const char *inbuf ) { size_t inlen = strlen( inbuf ); char * outbuf = new char[inlen * 2 + 2]; string strRet; if(code_convert( "gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2 ) == 0) { strRet = outbuf; } delete[] outbuf; outbuf = NULL; return strRet; }
注意修改iconv中.h ;.c中函数形参,否则编译不过
const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen
由于NDK的变更,针对protobuf的编译config.h存在一定的变化 编译android 和IOS 等平台调整:
/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* the name of <hash_map> */ #define HASH_MAP_CLASS unordered_map #if _WIN32 /* the location of <unordered_map> or <hash_map> */ #define HASH_MAP_H <tr1/unordered_map> #else //IOS #define HASH_SET_H <unordered_map> #endif #if _WIN32 /* the namespace of hash_map/hash_set */ #define HASH_NAMESPACE std::tr1 #else //IOS #define HASH_NAMESPACE std R[2] #endif /* the name of <hash_set> */ #define HASH_SET_CLASS unordered_set #if _WIN32 /* the location of <unordered_set> or <hash_set> */ #define HASH_SET_H <tr1/unordered_set> #else //IOS #define HASH_SET_H <unordered_set> #endif /* Define to 1 if you have the <dlfcn.h> header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the <fcntl.h> header file. */ #define HAVE_FCNTL_H 1 /* Define to 1 if you have the `ftruncate' function. */ #define HAVE_FTRUNCATE 1 #if _WIN32 /* define if the compiler has hash_map */ #define HAVE_HASH_MAP 1 /* define if the compiler has hash_set */ #define HAVE_HASH_SET 1 #else /* * TODO: Figure out how to use stlport unordered_map and set. * For some reason they don't work when I try to point the * HASH_MAP_H and HASH_SET_H to the stlport files, I get * compile timer errors. */ /* define if the compiler has hash_map */ #undef HAVE_HASH_MAP /* define if the compiler has hash_set */ #undef HAVE_HASH_SET #endif /* Define to 1 if you have the <inttypes.h> header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the <limits.h> header file. */ #define HAVE_LIMITS_H 1 /* Define to 1 if you have the <memory.h> header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the `memset' function. */ #define HAVE_MEMSET 1 /* Define to 1 if you have the `mkdir' function. */ #define HAVE_MKDIR 1 /* Define if you have POSIX threads libraries and header files. */ #define HAVE_PTHREAD 1 /* Define to 1 if you have the <stdint.h> header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strchr' function. */ #define HAVE_STRCHR 1 /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 /* Define to 1 if you have the <strings.h> header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the <string.h> header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the `strtol' function. */ #define HAVE_STRTOL 1 /* Define to 1 if you have the <sys/stat.h> header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the <sys/types.h> header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the <unistd.h> header file. */ #define HAVE_UNISTD_H 1 /* Enable classes using zlib compression. */ #define HAVE_ZLIB 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Name of package */ #define PACKAGE "protobuf" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "[email protected]" /* Define to the full name of this package. */ #define PACKAGE_NAME "Protocol Buffers" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "Protocol Buffers 2.5.0" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "protobuf" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "2.5.0" /* Define to necessary symbol if this constant uses a non-standard name on your system. */ /* #undef PTHREAD_CREATE_JOINABLE */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # define _ALL_SOURCE 1 #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # define _POSIX_PTHREAD_SEMANTICS 1 #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # define _TANDEM_SOURCE 1 #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # define __EXTENSIONS__ 1 #endif /* Version number of package */ #define VERSION "2.5.0" /* Define to 1 if on MINIX. */ /* #undef _MINIX */ /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ /* #undef _POSIX_1_SOURCE */ /* Define to 1 if you need to in order for `stat' and other things to work. */ /* #undef _POSIX_SOURCE */