从何说起?
前段时间,公司有个前端妹子找到我说:“Q哥,我想把我们项目的部分公共业务逻辑提取出来…”,话还没说完就被我打断了。“嗯,挺好的,抽个公共类吧”,我故作镇定的说道。“不是的,我想要…让你帮我用C++写一套,以后就能不区分平台的使用了嘛,你就帮帮我啪”,艹,打错了,是”吧“。咳咳,终于,妹子还是露出了本性。呵,女人!
算了,本着助人为乐的态度(主要还不是看长相),Q哥我决定帮助妹子实现这个伟大的愿望。
欠揍,不,前奏
刚开始学 C++ 的时,和其他语言一样,我们都是用着一样的if else 打天下,switch case 玩的贼6,猛然间仿佛有一种错觉,C++ 也没啥嘛,我这么快就掌握了。可是。随着项目压力和时间无情的鞭挞,在项目实战中被各种啪啪打脸后,才发现脚踏实地,地上全是坑的道理呀!
C++ 是一种标准,它的源代码可跨平台,基于不同的平台进行编译。。我们在所有操作系统中都可以看到C++ 的影子,因此我们常常有一种需求是做一个 C++ 库拿来到处用,多省事。
撩妹之路起始篇
好了,废话不多说,我这里使用 QT Creator 新建项目,当然使用宇宙第一 VS 也可以,由于之后的系列的内容,包括 Android NDK 的构建都是基于 QT 的,因此选用了 QT Creator。
首先,假设你已经配置好了所有的环境,当然也包括后面要用的 Android SDK 和 NDK 环境。
新建 C++ 项目,支持的平台选择 Android设备 模板,基于 Cmake构建(QTcreator 默认是 Qmake,但是为了跨平台,用 Cmake 更易于我们的前端小妹理解和后面的学习),最后因为我们要给前端小妹一个 so 库,因此选择需要选择 Android arm64-v8a 套件(不要选择 MSVC 哦),这个可以随便选择,根据自己 QTcreator默认识别的来。
最后,我们的项目结构如上图所示。
撩妹之路实战篇
有了上面的项目框架,接下来就看真功夫了。
首先新建三个文件 testglobal.h,sotest.h 和 sotest.cpp 。
//testglobal.h
#ifndef TEST_GLOBAL_H
#define TEST_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(TEST_LIBRARY)
# define TESTSHARED_EXPORT Q_DECL_EXPORT
#else
# define TESTSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // TEST_GLOBAL_H
//test.h
#ifndef TEST_H
#define TEST_H
#include"testglobal.h"
extern "C"
{
void TESTSHARED_EXPORT test(int a,int b);
}
#endif // TEST_H
//test.cpp
#include"test.h"
#include<iostream>
using namespace std;
void TESTSHARED_EXPORT test(int a,int b)
{
std::cout << "a+b:" << a+b << std::endl;
}
//重点:cmake.txt
cmake_minimum_required (VERSION 2.6)
project(soTest)
set(QT_DIR "D:/WorkSoftware/Qt5.12.0_for_android/5.12.0/android_arm64_v8a")
set(ANDROID_ABI arm64-v8a)
set(ANDROID_NDK D:/Java/android-ndk-r20)
set(CMAKE_TOOLCHAIN_FILE ${ANDROID_NDK}/build/cmake/android.toolchain.cmake)
set(CMAKE_MAKE_PROGRAME ${ANDROID_NDK}/prebuilt/windows-x86_64/bin/make.exe)
set(ANDROID_TOOLCHAIN clang)
set(ANDROID_PLATFORM android-21)
set(ANDROID_STL c++_shared)
set(ANDROID_SYSROOT ${ANDROID_NDK}/sysroot)
set(ANDROID_ABI_NAME "android_arm64_v8a")
include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android)
set(Qt5_DIR "${QT_DIR}/lib/cmake/Qt5")
set(Qt5Core_DIR "${QT_DIR}/lib/cmake/Qt5Core")
find_package(Qt5 COMPONENTS Core REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(HEADERS
testglobal.h test.h
)
set(SOURCES
test.cpp
)
add_library(${PROJECT_NAME} SHARED ${HEADERS} ${SOURCES})
target_link_libraries(soTest Qt5::Core)
右键“构建”,完成后即可在 build 目录找到生成的 libsoTest.so
若执行 Cmake 时出错,比如提示:
则参考下面这篇文章的小结:“2.QTCreator 工具编译”解决。
QT 跨平台开发(二)之现有项目在linux和windows下利用NDK 和 Cmake 编译为android so库
撩妹之路装逼篇
一顿操作后,终于可以拿给前端小妹试用(装逼)了,这是小妹给我的调用截图:
诶呦,我去,有人能告诉我妹子这是啥意思吗?
csdn地址:http://blog.csdn.net/u012534831
github地址:https://github.com/qht1003077897
源码地址:https://download.csdn.net/download/u012534831/12459034
如有帮助,请多多点赞支持哦。