NDK STL庫調與 System.load動態加載so

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

Android NDK的C++11標準支持ide

Android C/C++混編問題函數

 

百度一下,發現不少人對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文件找不到狀況,解決方法

相關文章
相關標籤/搜索