【教程分享】cocos2dx使用了第三方库照样移植android平台-解决iconv库的移植问题

当我写这篇文章的时候我是怀着激动的心情的,因为我又解决了一个技术问题。你可能对题目还一知半解,这是什么意思,
我之所以要写这篇文章就是要解决当我们在cocos2dx中使用了第三方库的时候,移植到android平台的过程中是会报错的问题,典型的例子就是我在上几篇博客中使用了编码转换的库iconv,在我移植到android平台测试的时候就出现了错误,各种各样的错误,网上搜了一下,
但是网上的方法感觉都很老了,有的也没说明白,今天通过摸索马上分享给大家,让大家也少走歪路。

如果你还不会移植android平台,请先看我上一篇的博客,先换个其他的不包含iconv库的工程,移植成功了再来做今天的事情。今天我们不需要准备任何工具,需要做的就是理解.mk文件的含义,知道怎么改。我们先来看一下我字体和字符编码这篇博客GBKToUTF8的头文件是怎么包含iconv库的。

#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#include "iconv\iconv.h"
#else
#include "../../../../libiconv/include/iconv.h"
#endif



```


如果是win32平台的话就用引擎里边的第三方库,这个iconv库所在的路径是:
E:\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\platform\third_party\win32\iconv。但如果是移植到android平台的你需要加上你android平台的库的路径,也就是说你需要先http://pan.baidu.com/s/1qW4jQvq,放到一个你的路径,这里我放到的是我引擎的根目录下,所以写的就是上边的代码,大家下去下载这个库,然后按我说的改了代码。然后我们就来看看这个.mk文件改怎么改,我们要修改的是jni目录下的.mk文件,我先截上几张图片,说说里边代码的含义。

![](http://www.zaojiahua.com/wp-content/uploads/2014/02/2014-02-28_224700.jpg)

上边的这张图片网上有不少的教程都说需要修改,但在我看来根本不是,因为当我在这里加了iconv.h的路径以后编译的时候任然报错,说找不到iconv.h这个文件。所以以后大家也不要改这里,没用的。

![](http://www.zaojiahua.com/wp-content/uploads/2014/02/2014-02-28_224719.jpg)


![](http://www.zaojiahua.com/wp-content/uploads/2014/02/2014-02-28_224735.jpg)

上边的第一张图片看到了划线的地方了吗?这个是我加上去的,你需要改吗?答案是需要的,但是名字可以和我不一样,那名字改成什么样的呢,这得看另一个文件了,我们等等再说。上面的第二张图片那个划线的地方也是我加上去的,你也需要修改,改成什么也需要看另一个文件。好了现在我们就来说到底看哪个文件。
这个文件就是你下载的iconv库的根目录下的Android.mk文件,我再来截张图。

![](http://www.zaojiahua.com/wp-content/uploads/2014/02/2014-02-28_225501.jpg)

这个是文件中的俩句话,你要和上边我说的改的那俩个地方对照起来改。好了其实就是这么简单,
Android.mk文件只需要对照的改上俩个地方就可以了,程序中的那个头文件包含也要修改。现在我们就来导入到工程中构建一下工程吧。在构建的时候也会出现一个问题,我想这个问题的原因可能是因为iconv库里边实现的函数不一样吧,出现的错误的语句是这句:
-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength)


```


我们需要做如下的修改,就是在pin的前边加个强转,因为Android下函数需要传入的参数是char**,而我们程序中的pin是const char **类型的。


-1 == iconv(iconvH, (char **)pin, &strLength, &outbuf, &outLength)


```

有了以上的这些操作问题就解决了,这里提醒一下大家,在eclipse中构建工程的时候如果可以编译通过了,但是工程中有错误提示(其实是没有错误的,也不知道这个eclipse是怎么回事),大家就重新导入工程一遍,问题就解决了,还有什么问题就给我留言吧。
本帖有小塔原创,转载请注明出处!

绕了远路了吧?
NDK自带的iconv的 查看 android-ndk-r9d/sources/android/support/include/iconv.h

LOCAL_WHOLE_STATIC_LIBRARIES += android_support
$(call import-module,android/support)

经验还是要马克一下

— Begin quote from ____

引用第1楼xhcnb于2014-03-24 12:18发表的 :
绕了远路了吧?
NDK自带的iconv的 查看 android-ndk-r9d/sources/android/support/include/iconv.h

LOCAL_WHOLE_STATIC_LIBRARIES += android_support
$(call import-module,android/support)
http://www.cocoachina.com/bbs/job.php?action=topost&tid=195310&pid=909840

— End quote

谢谢提醒,原来如此,收益了!

留个脚印,学习学习,谢谢楼主分享经验

顶个,不错的帖子。可惜啊,我的打包出来在win32可以显示中文,在andriod里不行啊。可能是哪出错了,我再研究下:2::2:

O了。第二次编译到android 中文出现了,果然是大神。顶顶。。。:14::14::14::2::2::2:

您好,我遇到一个问题:

我在Android.mk中已经加入了

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

以及

$(call import-module,network)

但在我自己的Classes文件里面 #include "HttpClient.h"的时候,依然有这样的错误

fatal error: HttpClient.h: No such file or directory
 #include "HttpClient.h"

我又看了一下android项目目录下的obj/local/armeabi文件,发现有:
libbox2d.a(文件)
libchipmunk.a
libcocos2d.a
libcocos2dandroid.a
libcocos2dcpp.so
libcocosdenshion.a
libcpufeatures.a
objs(文件夹)

我似乎发现不管我修改这个Android.mk的LOCAL_WHOLE_STATIC_LIBRARIES参数后,在cocos compile -p android的时候都没有成功的编译.a/.so的动态库啊

这个是不是造成无法include的原因呢?

还有就是,在我去掉了 #include "HttpClient.h"的.cpp文件之后,又出现了
fatal error: cocos-ext.h: No such file or directory

#include "cocos-ext.h"

的问题。。。

而以上这些编译错误在xocde编译iOS的时候是不存在,仅仅发生在android的时候
这个是我的部分.mk文件

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                    $(LOCAL_PATH)/../../Classes/NDKHelper \
                    $(LOCAL_PATH)/../../Classes/jansson


LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static


include $(BUILD_SHARED_LIBRARY)

$(call import-module,2d)
$(call import-module,audio/android)
$(call import-module,Box2D)
$(call import-module,network)
$(call import-module,extensions)

环境是OS X + cocos2d-x-3.0rc1

2楼, 我怎么用你的方法,一办好“iconv.h"头文件就报错啊

好贴,新手学习中

1楼和2楼的方法都不行,依然是这个错误

In file included from jni/…/…/Classes/AppDelegate.cpp:3:0:
jni/…/…/Classes/Convert.h:4:25: fatal error: iconv\iconv.h: No such file or directory
compilation terminated.
make.exe: *** Error 1

anroid.ml文件如下:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

LOCAL_SRC_FILES := hellocpp/main.cpp
…/…/Classes/AppDelegate.cpp
…/…/Classes/HelloWorldScene.cpp
…/…/Classes/Convert.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/…/…/Classes

LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
LOCAL_WHOLE_STATIC_LIBRARIES += android_support
LOCAL_WHOLE_STATIC_LIBRARIES += libiconv_static

include $(BUILD_SHARED_LIBRARY)

(call import-module,cocos2dx) (call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)
(call import-module,CocosDenshion/android) (call import-module,extensions)
(call import-module,external/Box2D) (call import-module,external/chipmunk)
(call import-module,android/support) (call import-module,libiconv)

以前老版本就被这个问题折腾的要死。。。mark~~

正好项目需要这个,学习了!谢谢分享!

我前两天也遇到了字符编码的问题,最开始我在PC上写的时候,脑子进水了,直接使用了Win32的API来编写了自己的编码转换函数,调试的时候也没有问题,后来编译到Android平台编不过,于是想用iconv库,然后又悲剧了。所以决定用C++的库编写一个编码转换的函数,还是不成功,最后我决定用C语言的库写编码转换,成功。从此编码转换无须第三方库。一劳永逸!!!
嘎嘎嘎http://pan.baidu.com/s/1o67a0dG,1。:14:

下载链接为百度网盘链接。没有找到本站附件上传方法。如果有知道请告诉我下。
该代码支持 ANSIC UNICODE UTF8 编码 转换。

我这里也有两篇文章,也实现了增加静态库,包括vc和android的
http://www.cppblog.com/zdhsoft/archive/2014/05/11/206890.html
http://www.cppblog.com/zdhsoft/archive/2014/05/11/206891.html

留名,以后应该会用到

楼主能不能出一个第三方打包和配置的教程呢~~~

那请问在C++文件怎么引入头呢?

楼主,使用android_support,c++文件怎么引入头?

谢谢楼主的分享!