日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iconv android 编译,将iconv编译成lua接口

發(fā)布時間:2023/12/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iconv android 编译,将iconv编译成lua接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前一篇博文說了。在cocos2dx中怎么樣使用iconv轉(zhuǎn)碼,這節(jié)我們將上一節(jié)中寫的轉(zhuǎn)碼函數(shù),做成一個lua接口。在lua腳本中使用。

網(wǎng)上能夠下載到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 #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 #define MAX_STRING_SIZE 1024

#define TEST_STR ("Hello, 這是個轉(zhuǎn)碼測試字符串")

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}

};

// 函數(shù)名必須為luaopen_xxx,當(dāng)中xxx表示library名稱,Lua代碼require "xxx"須要與之相應(yīng)。

int luaopen_iconv(lua_State* L)

{

const char* libName = "iconv";

luaL_register(L, libName, iconvlib);// 調(diào)用方式libName.函數(shù)名

return 1;

}

int tolua_iconv_open(lua_State *L)

{

luaopen_iconv(L);

return 1;

}

在AppDelegate中

#include "luaiconv.h"

然后在AppDelegate::applicationDidFinishLaunching()中調(diào)用:

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

切記在末尾加上空格和續(xù)行符:" \"

否則有可能會報錯:

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

總結(jié)

以上是生活随笔為你收集整理的iconv android 编译,将iconv编译成lua接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。