将iconv编译成lua接口

前一篇博文说了。在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

时间: 2024-10-07 18:14:41

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

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

项目要求lua加密脚本,有关调查的相关信息 ,学习lua自己可以使用luac编译成字节码脚本(bytecode)启用加密,我试了一下.确实是可行. 以下是本机lua编译字节码解释器: 1.创建一个名为1.lua文件,只有一个字print("Hello Lua"),新建一个空的out.lua脚本文件 2.開始--执行--cmd 3.luac -o out.lua 1.lua 注: luac -o [编译后脚本名] [脚本名],必要时带上脚本路径,如: 回车之后,再打开out.lua就能够

Java前端编译:Java源代码编译成Class文件的过程

Java前端编译:Java源代码编译成Class文件的过程 在上篇文章<Java三种编译方式:前端编译 JIT编译 AOT编译>中了解到了它们各有什么优点和缺点,以及前端编译+JIT编译方式的运作过程. 下面我们详细了解Java前端编译:Java源代码编译成Class文件的过程:我们从官方JDK提供的前端编译器javac入手,用javac编译一些测试程序,调试跟踪javac源码,看看javac整个编译过程是如何实现的. 1.javac编译器 1-1.javac源码与调试 javac编译器是官方

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

以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:Ubuntu 15.04 参考资料: ubuntu源码安装swig 利用swig转换C++接口到Java接口 SWIG3.0说明文档 编程中出现的错误: java编译时出现undefined symbol:... 此种情况大部分原因是需要在原来的C++库中添加链接某lib....so文件(undefined symbol: _ZN5boost6system15

cocos2d-x v3.0的window平台搭建和编译成andriod程序

首先添加这个地址到系统环境变量,path 然后打开CMD,输入如下语句 现在就可以创建一个新项目了 这样一个空的cocos2d-x v3.0的项目就创建好了 接下来编译andriod程序 先在系统环境变量中添加一个NDK_ROOT 然后打开cmd 然后就开始编译了 接下来打开ADT中的eclipse 再添加andriod文件夹到工程里 cocos2d-x v3.0的window平台搭建和编译成andriod程序,布布扣,bubuko.com

C代码编译成可执行程序的过程

C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc -E [源文件]  -o [预处理文件] 3.案例:用gcc编译器预处理demo1.c代码,预处理后的文本放到demo1.i中.(gcc -E demo1.c -o demo1.i) demo1.c代码如下: 1 #include <stdio.h> 2 3 #define add(a, b)

转载:将STM32的标准库编译成lib使用【图文】

from:http://www.cnblogs.com/zyqgold/p/3189719.html 百度上边也有不少关于lib文件的文章,恰巧看到该博文,感觉该博文的条理清晰,步骤明确,故复制到这个博文中收藏,若文章作者看到且觉得不能装载,麻烦请告知,谢谢. 验证状态: 博主没有验证该博文. 将STM32的标准库编译成lib使用[图文] 以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间

关于.Net中Process的使用方法和各种用途汇总(二):用Process启动cmd.exe完成将cs编译成dll

上一章博客我为大家介绍了Process类的所有基本使用方法,这一章博客我来为大家做一个小扩展,来熟悉一下Process类的实际使用,废话不多说我们开始演示. 先看看我们的软件要设计成的布局吧. 首先我们需要给定会使用到的dll,记得vs中的引用那一项吗?我们虽然不需要将这里面的引用全部导入进来,但是我们需要将我们使用过的dll全部导入进来,不然编译时会提示找不到类方法之类的. 可能有些同学不知道怎么查看一个类或者方法所在的dll,其实只用对着那个方法或者类按下f12就能在打开的文档的正上方看到所

ui所需要的一些lua接口

--按钮类 --获取名字function obj:getName()end --获取宽度function obj:getWidth()end --获取高度function obj:getHeight()end --禁用启用function obj:setEnabled(true)end --获取当前禁用启用状态function obj:isEnabled()end --设置触摸开始时的回调函数[email protected] {function} func 回调函数,此函数接受3个参数[用户数

如何将源码文件编译成字节码文件

[[email protected] ~]# cat 1.py # 要编译的源码文件 #!/usr/bin/python print 'Hello World' [[email protected] ~]# cat 2.py # 将 1.py 编译成字节代码 #!/usr/bin/python import py_compile py_compile.compile('1.py') [[email protected] ~]# python 2.py [[email protected] ~]#