NDK撩妹三部曲—站住同学,我这有个C++的so库,底层运算效率飞起,想不想要?

从何说起?

  前段时间,公司有个前端妹子找到我说:“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默认识别的来。
新建C++ library
基于Cmake构建
选择 MSVC 套件
项目结构
最后,我们的项目结构如上图所示。

撩妹之路实战篇

有了上面的项目框架,接下来就看真功夫了。

首先新建三个文件 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

如有帮助,请多多点赞支持哦。

猜你喜欢

转载自blog.csdn.net/u012534831/article/details/106343264