作者本身是c/c++语言的小白, 并且初次使用Android studio的cMake功能,所以本篇文章适合和我类型情况的同学去了解以及掌握此功能的基本使用。深度学习者请绕行…
最近项目一些安全性考虑,项目部分代码要用c++编写,客户端来集成,之前都是集成第三方的库,直接拿来用,这次要自己来集成了,刚开始也是一脸懵逼,不过看了很多博客自学之后,基本完美实现,下面就总结下基本的、实用的实用方法。
第一步:添加工具
在SDK Tools中勾选安装CMake、LLDB、NDK。 其中的LLDB是调试本地代码的工具,可以调试C++代码!!!
第二步:创建一个最简单的官方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. build.gradle中
defaultConfig中
externalNativeBuild {
cmake {
cppFlags ""
abiFilters 'armeabi','armeabi-v7a','x86'
}
}
abiFilters可以设定生成哪几种abi,不写就是生成所有类型的
android中
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
指定你的CMakeLists文件的位置
3.在app moudle下有一个CMakeLists.txt文件,此文件是CMake 构建脚本,名字不可更改,路径可以随意换,但是必须和build.gradle中的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的头文件如图:
第五步:在CMakeLists.txt中加入这个c++/c的路径添加,如图:
第六步:在代码中调用,如图:
*第七步:***clean项目然后Make project,run。在手机上就会看到实现的效果。如图:
按上述步骤即可实现使用Android studio cMake打包.so库,.so的路径在build——>intermediates——>cmake下,因为在自己项目中做,每次编译都会进行cMake操作,耗时也没必要。所以建议新建一个和自己项目的包名一致的项目专门生成.so库的工作,把生成的.so库引入到自己项目中使用即可,
————————————————
版权声明:本文为CSDN博主「EvilerNotes」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lei_notes/java/article/details/78548433