AS请参考以下连接html
http://blog.csdn.net/ashqal/article/details/21869151java
http://www.bubuko.com/infodetail-1006521.html网络
http://www.cnblogs.com/flyme/p/4431762.htmlapp
百度一下,发现不少人对ndk 使用stl库很不全面,对于不少版本的stl库,好比stlport,gnustl的静态库(stl_static)和共享库(stl_shared)均可以使用,spa
目前网络博客大部分对gnustl _static 过度着墨,所以,我这里之讲述gunstl_shared库的使用。.net
对于Android可以使用的STL库有不少,但gnustl功能无疑是最全面,gnustl C++ 是功能最全面的stl库,在这里,咱们以gnustl_shared为code
Application.mkhtm
Android.mk
ndkstl.cpp
预处理一些函数和变量
而后执行代码
int testVector() { vector<string> catlst; int i = 0; char temp[MAX_BUFFER_SIZE]; for (i = 0; i < 10; ++i) { memset(temp,0,MAX_BUFFER_SIZE); sprintf(temp,"Category_%d",(i+1)); string s(temp); catlst.push_back(temp); } if(!catlst.empty()) { vector<string>::iterator result; result = find(catlst.begin(),catlst.end(),"Category_4"); if(result==catlst.end()) { cout<<"查询失败"<<endl; Log::E("STL","查询失败"); }else{ cout<<"查询成功:"<<result-catlst.begin()<<endl; string s("查询成功"); s.append(":所在位置索引="); char buf[16]; sprintf(buf,"%d",result-catlst.begin()); s.append(buf); Log::E("STL",s.c_str()); } /*for (i = 0; i < catlst.size(); ++i) { string item = catlst[i]; outPrint(item); }*/ for_each(catlst.begin(),catlst.end(),outPrint); int s1 = catlst.size(); catlst.push_back("Category_4"); if(s1>catlst.size()) { Log::I("Vector","删除成功"); }else{ Log::I("Vector","删除晒白"); } catlst.clear(); }else{ cout<<"vector数据存储出错"<<endl; Log::E("STL","vector数据存储出错"); } } void testMap() { map<string,string> idMap; idMap.insert(pair<string, string>("HX9182", "Zhangsan")); idMap["HO8081"] = "王五"; idMap["HX9192"] = "Harfter"; }
在java代码中也要加载stl
static{ System.loadLibrary("gnustl_shared"); System.loadLibrary("ndkstl"); }
此外,说道这里,对于jni ndk so容错使用 loadLibrary是有问题
咱们在so模块不存在时,能够选择不调用jni方法,解决方法时适用System.load
//jni so位置在 "/data/data/"+getPackageName()+"/lib/目录下"
public class MainActivity extends FragmentActivity { private String checkJNISo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); checkJNISo = checkJNISo("libndkstl.so"); if(!TextUtils.isEmpty(checkJNISo)) { System.load(checkJNISo); } } @Override protected void onResume() { super.onResume(); if(!TextUtils.isEmpty(checkJNISo)) { `javaMain(); } } //用于检测 so模块是否存在,若是不存在,能够不调用so private String checkJNISo(String soName) { File filesDir = getFilesDir(); if(filesDir!=null) { String dataPath = filesDir.getParentFile().getAbsolutePath(); //jni so位置在 "/data/data/"+getPackageName()+"/lib/目录下" File f = new File(dataPath+"/lib/",soName);//"libndkstl.so"); if(f!=null && f.exists()) { return f.getAbsolutePath(); } } return null; } private native void javaMain(); static{ System.loadLibrary("gnustl_shared"); // System.loadLibrary("ndkstl"); } }
[-------------------------------------------------------------]
错误解决:
stl 库默认不是自动加载的,在项目中可能遇到gnustl C++ header文件找不到状况,解决方法