AS请参考如下链接
http://blog.csdn.net/ashqal/article/details/21869151
http://www.bubuko.com/infodetail-1006521.html
http://www.cnblogs.com/flyme/p/4431762.html
百度一下,发现很多人对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文件找不到情况,解决方法