文档章节

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

IamOkay
 IamOkay
发布于 2015/01/26 23:30
字数 594
阅读 3235
收藏 28

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

 

 

 

© 著作权归作者所有

IamOkay

IamOkay

粉丝 204
博文 483
码字总数 403228
作品 0
海淀
程序员
私信 提问
加载中

评论(2)

IamOkay
IamOkay 博主

引用来自“小猫嘿嘿哈”的评论

stlport不支持异常
是的 stlport不支持异常,但gnustl支持,所以我这里用的是gnustl
此号作废
此号作废
stlport不支持异常
Android Studio 2.2 更方便地创建JNI项目-CMake

前段时间写了篇Android Studio 第一个NDK例子,它是在使用版本的实现方案,最近发现稳定版本已经出来了,所以更新了版本,发现使用该版本创建Jni项目更加方便了。 使用Android Studio 2.2创建...

shzwork
03/30
3
0
Android NDK C++开发注意事项总结

相信Android开发者都喜欢用C++编写一些高效的应用,有关Android NDK的C++开发相关知识总结如下: 从Android NDK r5开始支持了STL Port,在这个版本开始就可以使用部分STL库的功能了,比如说v...

阿酷
2011/10/21
1K
0
AndroidStudio3.0NDK输出多个so库

个人博客地址 http://dandanlove.com/ 前言 去年的 Android之NDK开发初体验 这篇文章讲述NDK开发环境的搭建,以及在AndroidStudio3.0版本之前的NKDK简单开发。这次升级到Android Studio3.1,...

静默加载
2018/04/12
0
0
关于JNI写的DLL调用实际业务DLL的问题

标红圈的2个文件 是我根据 ClassWizard 加载的功能DLL 生成的 然后在我的DLL的这个CPP里面include进来 我想知道我的这个DLL在实际调的时候 是不是会去加载system32下的 动态库.因为我没有实际...

Chaos_heart
2013/01/22
410
2
Android小白成长之初级篇:NDK配置

AndroidNDK(Native Development Kit)实际上属于JNI(Java Native Interface)的一部分,JNI就是允许Java代码和其他语言写的代码进行交互。Android基于Java平台,自然也是支持这个特征了,因...

76135
2012/07/15
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

iptables删除命令中的相关问题

最近在做一个中间件的配置工作,在配置iptables的时候,当用户想删除EIP(即释放当前连接),发现使用iptables的相关命令会提示错误。iptables: Bad rule (does a matching rule exist in t...

xiangyunyan
42分钟前
2
0
IT兄弟连 HTML5教程 HTML5表单 新增的表单属性1

HTML5 Input表单为<form>和<input>标签添加了几个新属性,属性如表1。 1 autocomplete属性 autocomplete属性规定form或input域应该拥有自动完成功能,当用户在自动完成域中开始输入时,浏览器...

老码农的一亩三分地
今天
7
0
OSChina 周五乱弹 —— 葛优理论+1

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享米津玄師的单曲《LOSER》: mv中的舞蹈诡异却又美丽,如此随性怕是难再跳出第二次…… 《LOSER》-...

小小编辑
今天
1K
21
nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部