前一篇博文说了。在cocos2dx中怎么样使用iconv转码,这节我们将上一节中写的转码函数,做成一个lua接口。在lua脚本中使用。

网上能够下载到luaconv。可是编译的时候总是报错,所以自己写了一接口。

一 加入lua接口文件

// luaiconv.h

#ifndef __LUA_ICONV_H__
#define __LUA_ICONV_H__ #include "tolua++.h"
#include "tolua_event.h"
#include "lauxlib.h" #if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
#include "iconv.h"
#elif CC_TARGET_PLATFORM == CC_PLATFORM_IOS
#include <iconv.h>
#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#include "iconv.h"
#endif int tolua_iconv_open(lua_State *L); #endif

//luaiconv.cpp

#include "luaiconv.h"
#include <stdlib.h> #define MAX_STRING_SIZE 1024
#define TEST_STR ("Hello, 这是个转码測试字符串") bool iconv_convert(void *src, unsigned int src_len,char *src_charset, void *dest, unsigned int dest_len, char *dest_charset)
{
const char *in;
char *out,*dest_ptr;
size_t in_left,out_left,mutant,converted; in_left = src_len;
out_left = dest_len;
in = (char *)src;
out = dest_ptr = (char *)dest; iconv_t oConv=iconv_open(dest_charset,src_charset);
if(oConv==(iconv_t)(-1)){
printf("XXXXXXXXXX ERROR: unable to open libiconv.\n");
return false;
} mutant = iconv(oConv, &in, &in_left, &out, &out_left );
iconv_close(oConv); if(mutant == (size_t)(-1)){
printf("XXXXXXXXXX ERROR: unable to convert anything.\n");
return false;
}
converted = dest_len - out_left;
dest_ptr[converted]='\0'; printf("XXXXXXXXXX src string:%s\n", src);
printf("XXXXXXXXXX to convert %u characters, %u mutanted , %u converted \n",src_len,mutant,converted);
printf("XXXXXXXXXX dst string:%s\n", dest); return true;
} void convertTest()
{
char inStr[] = TEST_STR;
char outStr[MAX_STRING_SIZE];
iconv_convert(&inStr, sizeof(inStr), "GBK", &outStr, sizeof(outStr), "UTF-8");
printf("XXXXXXXXXX in string:%s\n", inStr);
printf("XXXXXXXXXX out string:%s\n", outStr);
} TOLUA_API int luaiconv(lua_State *L)
{
char *inbuf = (char*) luaL_checkstring(L, 1);
char *src_charset = (char*) luaL_checkstring(L, 2);
char *dst_charset = (char*) luaL_checkstring(L, 3); size_t ibleft = lua_strlen(L, 1);
size_t obleft = (ibleft > 256) ? ibleft : 256;
char *outbuf = (char*) malloc(obleft * sizeof(char));
if (outbuf == NULL) {
lua_pushstring(L, "");
return 1;
} if(!iconv_convert(inbuf, ibleft, src_charset, outbuf, obleft, dst_charset)){
lua_pushstring(L, "");
return 1;
} lua_pushstring(L, outbuf);
free(outbuf); return 1;
} static luaL_Reg iconvlib[] = {
{"luaiconv", luaiconv},
{NULL, NULL}
}; // 函数名必须为luaopen_xxx,当中xxx表示library名称,Lua代码require "xxx"须要与之相应。
int luaopen_iconv(lua_State* L)
{
const char* libName = "iconv";
luaL_register(L, libName, iconvlib);// 调用方式libName.函数名 return 1;
} int tolua_iconv_open(lua_State *L)
{
luaopen_iconv(L);
return 1;
}

在AppDelegate中

#include "luaiconv.h"

然后在AppDelegate::applicationDidFinishLaunching()中调用:

CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
tolua_iconv_open(pEngine->getLuaStack()->getLuaState());

在lua中这样使用:

require "iconv"
iconv.luaiconv("string to convert code","GBK","UTF-8")

二 改动项目的Android.mk

LOCAL_SRC_FILES 中加上luaiconv.cpp

切记在末尾加上空格和续行符:" \"

否则有可能会报错:

make: *** No rule to make target
'xxx.o', needed by 'xxx'. Stop

将iconv编译成lua接口的更多相关文章

  1. Cocos2d-x使用Luajit将Lua脚本编译成bytecode,启用加密

    http://www.cocoachina.com/bbs/read.php?tid=205802 lua脚本进行加密,查了一下相关的资料 ,得知lua本身能够使用luac将脚本编译为字节码(byte ...

  2. C#如果把A.new()编译成new A()

    缘由 对于初次接触某个第三方库的C#开发者,假如要调用里面一个方法,发现需要一个A类型的实例作为参数,怎么获得这个实例呢? 我想大多数人会先尝试new A吧: 如果没有,可能会尝试输入A.看看有没可能 ...

  3. 使用Maven将Hadoop2.2.0源码编译成Eclipse项目

    编译环境: OS:RHEL 6.3 x64 Maven:3.2.1 Eclipse:Juno SR2 Linux x64 libprotoc:2.5.0 JDK:1.7.0_51 x64 步骤: 1. ...

  4. JSP编译成Servlet(五)JDT Compiler编译器

    通过JSP编译器编译后生成了对应的java文件,接下去要把Java文件编译成class文件.对于这部分完全没有必要重新造轮子,常见的优秀编译工具有Eclipse JDT Java编译器和Ant编译器. ...

  5. JSP编译成Servlet(三)JSP编译后的Servlet

    JSP编译后的Servlet类会是怎样的呢?他们之间有着什么样的映射关系?在探讨JSP与Servlet之间的关系时先看一个简单的HelloWorld.jsp编译成HelloWorld.java后会是什 ...

  6. 如何将一段文本编译成C#内存程序的过程

    string code = null; // 1. 生成要编译的代码.(示例为了简单直接从程序集内的资源中读取) Stream stram = typeof(CodeDOM).Assembly .Ge ...

  7. Go 程序编译成 DLL 供 C# 调用。

    Go 程序编译成 DLL 供 C# 调用. C# 结合 Golang 开发   1. 实现方式与语法形式 基本方式:将 Go 程序编译成 DLL 供 C# 调用. 1.1 Go代码 注意:代码中 ex ...

  8. 使用SWIG将C++接口转换成Java接口

    PS:此文章仅作为个人记录使用,代码属于私密,故无法公开: 以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:U ...

  9. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

随机推荐

  1. Master&Slave是什么?

    由于前段时间公司项目比较赶,一直抽不出时间写博客,今天偷空写一篇吧.前面给大家讲解了单机版redis的基本操作,现在继续给大家讲解一下Redis的进阶部分,主从复制和读写分离. 一.Master&am ...

  2. Linux 系统自动备份数据库及定时任务的设置

    首先想到数据库的自动备份,由于涉及业务原因需要在每天固定的时间去调用方法执行备份.如果不考虑业务要求,只考虑实现的话可以通过Linux系统提供的定时任务去完成备份操作. 本文讲的就是利用Linux系统 ...

  3. Django标签之包含标签Inclusion tags

    Django过滤器和标签功能很强大,而且支持自定义标签,很是方便:其中一种标签是Inclusion tags,即包含标签,个人感觉比较反人类的 包含标签(Inclusion tags)通过渲染其他的模 ...

  4. SpringBoot基础之MockMvc单元测试

    SpringBoot创建的Maven项目中,会默认添加spring-boot-starter-test依赖.在<5分钟快速上手SpringBoot>中编写的单元测试使用了MockMvc.本 ...

  5. poj 6243 Dogs and Cages

    Dogs and Cages Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  6. LeetCode OJ-- Reverse Integer

    https://oj.leetcode.com/problems/reverse-integer/ 一个整数,给反过来,比如123输出321.注意12300的情况,应该输出321,还有-123,是-3 ...

  7. Windows下php环境变量的配置

    1.找到php的路径比如"E:\php_env\PHP".    2.需要保证该目录下php.ini的配置是正确的,如果是刚下载的php包,则可能需要修改相应的一些配置:将php目 ...

  8. kswapd0 进程 设置 swap

    kswapd0是虚拟内存管理中,负责换页,说白了就是你的物理内存不够用了 现在的服务器,一般内存都很高,所有很少使用 swap 分区了   这时候考虑的两种处理办法 加大物理内存 或者 增加swap分 ...

  9. POJ 3368.Frequent values-处理数据+RMQ(ST)

    昨天写的博客删了,占坑失败,还是先把RMQ玩的6一点再去搞后面的东西.废话少说,题解题姐姐_(:з」∠)_      Frequent values Time Limit: 2000MS   Memo ...

  10. Codeforces Gym101502 K.Malek and Summer Semester

    K. Malek and Summer Semester   time limit per test 1.0 s memory limit per test 256 MB input standard ...