数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类 全部分类技术牛文全部分类教程最新 网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava 新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销 开发数据库服务器系统虚拟化云计算 嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

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

来源:本网整理


百度一下,发现很多人对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文件找不到情况,解决方法




  • 本文相关:
  • andriod编程中如何获取一段语音的时长?
  • Android 转场动画 windowAnimation和ActivityAnimation的区别
  • 如何在EditText中显示提示文字
  • Android 4.2 Wifi Display 之 Settings 源码分析
  • 深入Android开发之--Android事件模型
  • Eclipse LogCat没有输出任何信息
  • 获取Android设备上的详细的摄像头信息
  • Android View中滚动相关
  • android ViewPager滑动事件讲解
  • 奇葩属性:layout_weight 的解释及使用
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved