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
预处理一些函数和变量
然后执行代码
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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
?
1
2
3
4
|
static { System.loadLibrary( "gnustl_shared" ); System.loadLibrary( "ndkstl" ); } |
此外,说道这里,对于jni ndk so容错使用 loadLibrary是有问题
我们在so模块不存在时,可以选择不调用jni方法,解决方法时适用System.load
//jni so位置在 "/data/data/"+getPackageName()+"/lib/目录下"
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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文件找不到情况,解决方法