⼩⽩初⽤Androidstudio的cMake编译⽣成.so库并调⽤
作者本⾝是c/c++语⾔的⼩⽩, 并且初次使⽤Android studio的cMake功能,所以本篇⽂章适合和我类型情况的同学去了解以及掌握此功能的基本使⽤。深度学习者请绕⾏…
最近项⽬⼀些安全性考虑,项⽬部分代码要⽤c++编写,客户端来集成,之前都是集成第三⽅的库,直接拿来⽤,这次要⾃⼰来集成了,刚开始也是⼀脸懵逼,不过看了很多博客⾃学之后,基本完美实现,下⾯就总结下基本的、实⽤的实⽤⽅法。
第⼀步:添加⼯具
在SDK Tools中勾选安装CMake、LLDB、NDK。 其中的LLDB是调试本地代码的⼯具,可以调试C++代码cmake如何使用
第⼆步:创建⼀个最简单的官⽅demo,File——>New——>NewProject,选中最下⽅的Include C++ Support
这个项⽬是⼀个最简单是实⽤cMake编译c++⽣成.so的项⽬,此项⽬有⼏个关键点:
1.在src/main/cpp中存在native-lib.cpp⽂件,它是提供对外接⼝的,之后我们调⽤时就是通过⼀个java类调⽤这个c++⽂件中的接⼝的。其中的extern “C”的作⽤是如果我们调⽤的除了c++还有c代码的话,需要在对应的接⼝⽅法前添加这句,进⾏转化调⽤。如果多个⽅法都包含有c代码,也可以这样做:
Java_com_jnitest_MainActivity_stringFromJNI这个是定义的接⼝样式,必须以Java开头,com_jnitest是你的包名,MainActivity是⽤java类加载.so以及声明调⽤⽅法的类名,不⼀定⾮要再activity中(不建议再activity中),可以创建⼀个类专门做此⼯作。stringFromJNI为调⽤的⽅法名。
2. adle中
defaultConfig中
externalNativeBuild {
cmake {
cppFlags ""
abiFilters 'armeabi','armeabi-v7a','x86'
}
}
abiFilters可以设定⽣成哪⼏种abi,不写就是⽣成所有类型的
android中
externalNativeBuild {
cmake {
path ""
}
}
指定你的CMakeLists⽂件的位置
3.在app moudle下有⼀个⽂件,此⽂件是CMake 构建脚本,名字不可更改,路径可以随意换,但是必须和adle 中的path保持⼀致。
其中add_library()中是制定需要⽣成的.so库的名字,这⾥demo是native-lib。
后⾯还有设置source file的,⽐如你要引⽤的其他c++/c代码。把具体某路径下的某⽂件名字添加上。
上⾯的为三个主要元素,准备完成之后点击Build——>Make project,完成后就会在app mould下的build——>intermediates——
>cmake下⽣成对应的.so库了,可以把这些.so拷贝到libs或者jniLibs下使⽤即可。
注意:只能在native-lib.cpp中对应包名的项⽬中使⽤,否则会报错。也就是说不是任何⼀个项⽬都能直
接使⽤你⽣成的.so库,前提是他的包名和上⾯1中的类名保持⼀致。
以上是cMake编译c++/c成.so库的最简单使⽤⽅式。但是我们往往在使⽤时需要多个c++/c的调⽤完成相关功能,但是对外的接⼝却只有⼀个类(native-lib.cpp),这就涉及到如何在native-lib.cpp中调⽤其他c++/c的代码了。在此demo的基础上做下扩展。
第⼀步:创建java对应的加载类。
这⾥不打算在activity中加载.so库,所以新建⼀个类专门做这件事,如图:
其中System.loadLibrary(”native-lib”)就是加载⽣成的.so库的,⽣成的.so库名字会⾃动加上lib前缀,我们写的时候不要把lib前缀加上。
public static native String encrypt(String param);就是我们调⽤的native-lib.cpp中声明的⽅法,需和native-lib.cpp声明的⽅法的最后⼀个下划线后⾯的名字保持⼀致。
第⼆步:添加需要的其他c++/c代码类。这⾥列举⼀个最简单的功能如图:
第三部:添加这个c++/c的头⽂件:如图
第四步:在native-lib.cpp中添加这个c++/c的依赖,相当于与java的导包,依赖的这个c++/c的头⽂件如图: