NDK STL库调与 System.load动态加载so

原创
2015/01/26 23:30
阅读数 1W

AS请参考如下链接

http://blog.csdn.net/ashqal/article/details/21869151

http://www.bubuko.com/infodetail-1006521.html

http://www.cnblogs.com/flyme/p/4431762.html

Android NDK的C++11标准支持

Android C/C++混编问题

 

百度一下,发现很多人对ndk 使用stl库很不全面,对于很多版本的stl库,比如stlport,gnustl的静态库(stl_static)和共享库(stl_shared)都可以使用,

目前网络博客大部分对gnustl _static 过分着墨,因此,我这里之讲述gunstl_shared库的使用。

 

对于Android可使用的STL库有很多,但gnustl功能无疑是最全面,gnustl C++ 是功能最全面的stl库,在这里,我们以gnustl_shared为

 

Application.mk

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文件找不到情况,解决方法

 

 

 

展开阅读全文
加载中
点击加入讨论🔥(2) 发布并加入讨论🔥
2 评论
28 收藏
1
分享
返回顶部
顶部