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文件找不到狀況,解決方法