Android NDK STL 库调与 System.load

对于Android可使用的STL库有很多,但gnustl功能无疑是最全面。

百度一下,发现很多人对ndk 使用stl库很不全面,往往gunstl static 过分着墨,因此,我这里之讲述 share库的使用。

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 库默认不是自动加载的,在项目中可能遇到header文件找不到情况,解决方法

时间: 2024-10-14 05:47:58

Android NDK STL 库调与 System.load的相关文章

Android NDK STL

相信Android开发者都喜欢用C++编写一些高效的应用,有关Android NDK的C++开发相关知识总结如下: 从Android NDK r5开始支持了STL Port,在这个版本开始就可以使用部分STL库的功能了,比如说vector.string摆脱c下面容易出现的数组未初始化.越界,增强应用的健壮性. 很多网友包含了include <vector> 这样头,但仍然无法编译,这里你首先要检查当前文件是否为.cpp后缀,同时为了使用标准库必须加入 APP_STL := stlport_st

Android NDK 下的宽字符编码转换及icu库的使用(转)

原贴http://topic.csdn.net/u/20101022/16/1b2e0cec-b9d2-42ea-8d9c-4f1bb8320a54.html?r=70149216 ,看过并动手实现,记录下来以备再用. 如果是在java层,有String类可以很好的转换各种编码,在ndk下面就没有现成的公开的工具,不过可以用icu4c. ICU4C 是IBM的国际化开发组件ICU的C语言实现版本.在android系统里也有实现.ndk里面并没有公开可用的api,需要自己加载动态库来调用转换函数.

Android NDK编程浅入深出之--Android.mk

    Android.mk Android.mk是一个向Android NDK构建系统描述NDK项目的GUN Makefile片段.它是每一个NDK项目的必备组件.构建系统希望它出现在jni子目录中.下面是hello-jni项目中Android.mk文件的内容. # Copyright (C) 2009 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License

System.load()与System.loadLibrary()

Java load 和 loadlibrary方法的区别 1.  相同点: 两个方法都是用来装载dll文件,不论是JNI库文件还是非JNI库文件.本地方法在被调用时都需要通过这两发方法之一将其加载至内存. 2.  不同点 a. System.load(String filename) ,参数为dll文件的绝对路径,可以是任意路径. System.load("D:\\java\\Test.dll"); b. System.loadLibrary(String libname) 参数为dl

【转载】cocos2dx 中 Android NDK 加载动态库的问题

原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各个平台的SDK,遇到了不少问题,也从中了解了不少知识,之前一直觉得没啥好写的,毕竟做了4个月的游戏开发,也没有碰上什么真正的大问题,cocos2dx的引擎包得也很好,能让人把大部分时间都关注在游戏逻辑.效果的处理上,当然,之前的libevent还是小坑一下,但是和后来遇到的相比,也算不上什么了. 我最

Android NDK——使用Android Studio引用so库,jar包及module并使用JNI的正确姿势

引言 由于项目中需要用到JNI,以前虽然在Eclipse上使用过JNI和SO 文件,移植到Android Studio上的时候是花费好些力气的,也处理过不少常见的错误,而且网上很多文章都是只写了大致的步骤,忽略了很多细节,为了让新手们少走弯路,同时也是加强自己的理解,把自己一步一步的操作记录下来. 一.Android studio引入jar 不同于eclipse的配置build path,Android Studio可以通过图形界面Project Structure来配置dependencies

如何在android app中使用STL库

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnustl_st

Android:百度定位异常Couldn&#39;t load locSDK4d from loader dalvik.system.PathClassLoader

Android Studio项目,使用百度定位时出现异常: Couldn't load locSDK4d from loader dalvik.system.PathClassLoader....findLibrary returned null 从网上找过解决方案,许多人说将 armeabi 下的 locSDK4d.so 复制一份到 armeabi-v7a下,可是我这么做之后问题依然存在. 后来找到的的有效的解决方案是,在项目的build.gradle下,在android标签内添加如下内容:

Android NDK开发及调用标准linux动态库.so文件

源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动将so文件和java应用一起打包成apk.对应:jni层c++开发 2.Cygwin:是windows平台上模拟Linux运行环境的工具,即window平台上的linux环境工具,so文件需要在linux平台上编译运行.对应:arm linux平台 3.CDT:eclipse下的C/C++开发工具,