Android NDK 编译C、C++混合程序小结(1)

来源:互联网 发布:mac safari收藏网页 编辑:程序博客网 时间:2024/05/29 10:38

1.C++中如果要使用STL的东西,如string.queue等等,需要在Application.mk文件中添加

[plain] view plaincop
  1. APP_CFLAGS += -fexceptions  
  2. APP_STL := gnustl_static  

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

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

[html] view plaincopy
  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 plaincopy
  1. APP_MODULES := libiconv  
关于Android对C++的支持: 
android本身支持的c++无异常处理、RTTI,c++标准库等。
不过有人定制了一个NDK,全支持这些了。 

为什么会出现如:error: undefined reference to '__cxa_end_cleanup' 的链接错误。Android上用stlport时。因为没有链接到libstdc++.a。所以出错。
因为用到了一些静态库, 所以必须要链接完整的libstdc++.a。可以在
http://crystax.net/android/ndk.php这里下载的包里
sources\cxx-stl\gnu-libstdc++\libs\armeabi目录中找到。
Android上本身的libstdc++支持有限,所以必须链接到一个完整的libstdc++.a才行。
在Android.mk文件中加入
LOCAL_LDFLAGS = $(LOCAL_PATH)/libs/libcurl.a \
$(LOCAL_PATH)/libs/libstdc++.a
以及LOCAL_CPPFLAGS += -lstdc++ -fexceptions就可以编译通过了。


2. .c文件不可以包含stl有关的头文件,例如queue,string。所以一些公用的头文件,要区分是在.c中调用还是z在.cpp中调用。

0 0
原创粉丝点击