现在的位置: 首页 > 综合 > 正文

Android NDK编译带STL的 C/C++ 程序

2013年07月21日 ⁄ 综合 ⁄ 共 5056字 ⁄ 字号 评论关闭

http://blog.csdn.net/langeldep/article/details/6948374

我的这个C/C++程序, 可以成功的交叉编译到中兴,烽火的机顶盒上运行, 原以为编译到android应该也是一件简单的事情, 但是做起来远比我想象的复杂得多。

我的程序中有 .C 文件 和 .CPP 文件 , 其中 .CPP 文件中用到了 STL的string, 编译成功后死活链接不到std::string库,提示报错   undefined reference to `std::basic_string 。

折腾了两天准备用NDK来 编译 stlport库, 但是以失败告终,报错如下:

[root@localhost jni]# /home/android-ndk-r6b/ndk-build 
Compile++ thumb  : stlport_shared <= dll_main.cpp
In file included from /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/stl/_stdexcept_base.h:25,
                 from /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/stl/_ios_base.h:22,
                 from /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/stl/_ios.h:23,
                 from /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/stl/_ostream.h:24,
                 from /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/stl/_string_io.h:23,
                 from /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/string:37,
                 from /home/android-ndk-r6b/samples/STLport-5.2.1/jni/src/dll_main.cpp:49:
/home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/stl/_exception.h:56:34: error: exception: No such file or directory

编译stlport的Android.mk文件内容如下所列, 不知道为何会报上面的错误, 没有找到解决办法, 如果哪位大侠找到原因, 成功编译了stlport, 还望多多指点为谢。

[plain] view
plain
copy

  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. libstlport_path := $(call my-dir)  
  6.   
  7. libstlport_src_files := \  
  8.         src/dll_main.cpp \  
  9.         src/fstream.cpp \  
  10.         src/strstream.cpp \  
  11.         src/sstream.cpp \  
  12.         src/ios.cpp \  
  13.         src/stdio_streambuf.cpp \  
  14.         src/istream.cpp \  
  15.         src/ostream.cpp \  
  16.         src/iostream.cpp \  
  17.         src/codecvt.cpp \  
  18.         src/collate.cpp \  
  19.         src/ctype.cpp \  
  20.         src/monetary.cpp \  
  21.         src/num_get.cpp \  
  22.         src/num_put.cpp \  
  23.         src/num_get_float.cpp \  
  24.         src/num_put_float.cpp \  
  25.         src/numpunct.cpp \  
  26.         src/time_facets.cpp \  
  27.         src/messages.cpp \  
  28.         src/locale.cpp \  
  29.         src/locale_impl.cpp \  
  30.         src/locale_catalog.cpp \  
  31.         src/facets_byname.cpp \  
  32.         src/complex.cpp \  
  33.         src/complex_io.cpp \  
  34.         src/complex_trig.cpp \  
  35.         src/string.cpp \  
  36.         src/bitset.cpp \  
  37.         src/allocators.cpp \  
  38.         src/c_locale.c \  
  39.         src/cxa.c \  
  40.   
  41. libstlport_cflags := -D_GNU_SOURCE  
  42. libstlport_cppflags := -fuse-cxa-atexit  
  43. libstlport_c_includes := $(libstlport_path) \  
  44.         $(libstlport_path)/stlport /home/android-ndk-r6b/samples/STLport-5.2.1/jni \  
  45.         /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport \  
  46.         /home/android-ndk-r6b/samples/STLport-5.2.1/jni/stlport/stl  
  47.   
  48.   
  49. LOCAL_MODULE := stlport_static  
  50. LOCAL_SRC_FILES := $(libstlport_src_files)  
  51. LOCAL_CFLAGS := $(libstlport_cflags)  
  52. LOCAL_CPPFLAGS := $(libstlport_cppflags)  
  53. LOCAL_C_INCLUDES := $(libstlport_c_includes)  
  54. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)  
  55. include $(BUILD_STATIC_LIBRARY)  
  56.   
  57. include $(CLEAR_VARS)  
  58. LOCAL_MODULE := stlport_shared  
  59. LOCAL_SRC_FILES := $(libstlport_src_files)  
  60. LOCAL_CFLAGS := $(libstlport_cflags)  
  61. LOCAL_CPPFLAGS := $(libstlport_cppflags)  
  62. LOCAL_C_INCLUDES := $(libstlport_c_includes)  
  63. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)  
  64. include $(BUILD_SHARED_LIBRARY)  


stlport编译失败, 只能在另外想办法了, 最后终于找到了问题所在, 把 .C 文件后缀修改为 .CPP后 问题得到解决。

我应用程序的 Android.mk文件如下 :

[plain] view
plain
copy

  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. LOCAL_MODULE := cloudstore_MTD  
  5. LOCAL_SRC_FILES := debug.cpp hash.cpp listex.cpp md5.cpp main.cpp http_fetcher.cpp spthreadpool.cpp storex.cpp markup.cpp   
  6. fusex.cpp  
  7.   
  8. LOCAL_C_INCLUDES := /home/android-ndk-r6b/samples/fuse-android/jni/include \  
  9.         /home/android-ndk-r6b/samples/sqlite-android/jni  
  10. #       /home/android-ndk-r6b/platforms/android-9/arch-arm/usr/include \  
  11. #       /home/android-ndk-r6b/sources/cxx-stl/gnu-libstdc++/include \  
  12. #       /home/android-ndk-r6b/samples/fuse-android/jni/include $(INCDIR)  
  13.   
  14. LOCAL_CFLAGS := -Wall -lulockmgr -pipe -D_FILE_OFFSET_BITS=64 -D_DEBUG -DANDROID_SDK -DUSE_OPEN -DUSE_THREAD -DDEBUG -O2  
  15.   
  16. INCLIB := /home/android-ndk-r6b/samples  
  17.   
  18. LOCAL_LDLIBS := $(INCLIB)/fuse-android/obj/local/armeabi/libfuse.a \  
  19.         $(INCLIB)/libiconv/obj/local/armeabi/libiconv.a \  
  20.         $(INCLIB)/sqlite-android/obj/local/armeabi/libsqlite3.a  
  21.   
  22. include $(BUILD_EXECUTABLE)  


我应用程序用到了STL,所以还得需要一个 Application.mk 文件, 内容如下 :

[plain] view
plain
copy

  1. APP_CFLAGS += -fexceptions  
  2. APP_STL := gnustl_static  


另外, 由于我的应用程序还需要用到 libiconv.a这个库, 但是android并没有这方面的支持, 所以我下载了libiconv的源码来通过NDK编译。

编译libiconv的 Android.mk文件内容如下:

[html] view
plain
copy

  1. LOCAL_PATH:= $(call my-dir)  
  2.   
  3. # first lib, which will be built statically  
  4.   
  5. include $(CLEAR_VARS)  
  6.   
  7. LOCAL_MODULE :iconv  
  8. LOCAL_SRC_FILES :libcharset/lib/localcharset.c lib/iconv.c lib/relocatable.c  
  9.   
  10. LOCAL_C_INCLUDES :include lib libcharset/include  
  11.   
  12. LOCAL_CFLAGS := -Wno-multichar -D_ANDROID -DLIBDIR="c" -DBUILDING_LIBICONV -DIN_LIBRARY  
  13. #LOCAL_PRELINK_MODULE :false  
  14. include $(BUILD_STATIC_LIBRARY)  


编译libiconv的Application.mk文件内容如下:

[plain] view
plain
copy

  1. APP_MODULES := libiconv  


至此, 应用程序编译完毕, 下来在Android平台上慢慢调试吧, 希望不要有问题。

抱歉!评论已关闭.