1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static 右边的值还可以换成下面几个:
system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持
stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的
stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。
gnustl_static - 使用 GNU libstdc++ 作为静态库
默认情况下STLPORT是不支持C++异常处理和RTTI,所以不要出现 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static来支持标准C++的特性,但生成的文件体积会偏大,运行效率会低一些。
支持C++异常处理,在Application.mk中加入 LOCAL_CPPFLAGS += -fexceptions这句,同理支持RTTI,则加入LOCAL_CPPFLAGS += -frtti,这里再次提醒大家,第二条说的使用gnustl静态库,而不是stlport。
强制重新编译 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以强制重新编译STLPort源码,由于一些原因可能自己需要修改下STLPort库,一般普通的开发者无需使用此项
2. 在要使用STL的cpp文件中包含相关的头文件,并且使用using namespace std;
stl对应的库位置在$(NKD_HOME)/sources/cxx-stl/stlport/stlport示例. Android.mk文件: 按正常的写
- # A simple test for the minimal standard C++ library
- #
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := test-libstl
- LOCAL_SRC_FILES := test-libstl.cpp
- LOCAL_LDLIBS := -llog
- include $(BUILD_EXECUTABLE)
- include $(CLEAR_VARS)
- LOCAL_EXECUTABLE := test-libstl
- APP_STL := stlport_static
- #APP_ABI := all
4. test-libstdc++.cpp内容:
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- int main() {
- vector<string> contents;
- for (int i=0; i<5; i++)
- {
- contents.push_back(string("vector"));
- }
- for (int i=0; i<5; i++)
- {
- cout << contents[i] << endl;
- }
- cout << "hello, world\n";
- return 0;
- }
在使用中遇到问题
string str("afdf");
const char * ch=str.c_str();
__android_log_print(ANDROID_LOG_DEBUG, "test", ch);
此句报错
error: format not a string literal and no format arguments [-Werror=format-security];
修改方法
jni/Application.mk添加:
APP_CFLAGS += -Wno-error=format-security
这是因为android-ndk-r9与Eclipse的版本不兼容导致的问题;
APP_CFLAGS : 一个C编译器开关集合,在编译任意模块的任意C或C++源代码时传递。它可以用于改变一个给定的应用程序需要依赖的模块的构建,而不是修改它自身的Android.mk文件。在这里format-security即忽略上述错误(其实我之前也没看过Application.mk的内容,用到的时候再研究吧)。