Qt Andriod 在Windows系统下编译和添加动态库(一)

2020.12.15 Sleep Tiger V1.0 Release as V1.0 2020.12.21 Sleep Tiger V1.1 修改文章版本,添加系统文章链接

前言

因为项目实际需求,在windows环境下配置了Andriod的开发环境。在项目开发过程中需要添加自己写的动态库,遇到了一些问题。总结一下:


参考文档链接:https://download..net/download/huowubin/6609853 提示:上文需要下载,而且需要修改。以下是本篇文章正文内容,下面案例可供参考

一、Qt 在Windows 系统下如何编译Andriod使用的动态库?

通过简单的示例来展示如何编译生成动态库(.so文件)

源码:

//xxx.h 文件
#ifndef MYLIB_H
#define MYLIB_H

#ifdef Q_WS_WIN //表示在windows环境
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif


class mylib
{
          
   
public:

    int mymax(int i, int j);
    int add(int i, int j);

};
extern "C" MY_EXPORT int diff(int i, int j);
#endif // MYLIB_H
//xxx.cpp文件
#include "xxx.h"
extern "C" MY_EXPORT int mylib::mymax(int i,int j)
{
          
   
    if(i>=j)
        return i;
    else
        return j;
}

extern "C" MY_EXPORT int mylib::add(int i,int j)
{
          
   
    return i+j;
}

extern "C" MY_EXPORT int diff(int i, int j)
{
          
   
    if(i>=j)
        return i-j;
    else
        return j-i;
}
//xxx.pro 文件
#-------------------------------------------------
#
# Project created by QtCreator 2013-11-11T09:44:53
#
#-------------------------------------------------

QT       -= core gui

TARGET = xxx
TEMPLATE = lib

DEFINES += XXX_LIBRARY

SOURCES += xxx.cpp

HEADERS += xxx.h

unix:!symbian {
          
   
    target.path = /usr/lib
    INSTALLS += target
}

选择安卓编译器 Andriod for armeabi-v7a , 然后点击Qt 左下角build 按钮【就那个小锤子】,等待构建完成。构建完成,然后点击进入编译生成的文件夹,可以看到已经生成动态库文件。

动态库生成路径: …uild-xxx_for_armeabi_v7a_GCC_4_9_Qt_5_9_1_for_Android_armv7-Releaseandroid-buildlibsarmeabi-v7a

二、Qt for Andriod如何在Windows开发环境下调用动态库

1.修改.pro文件

代码如下(示例):

///在源码的andriod的文件新建一个libs文件夹,然后把刚才编译生成的.so文件复制到该文件夹下
///-l 后面写的是生成库的文件名称 例如: libXXX.so  则-l写法如下
LIBS += -L$$PWD/android/libs  -lxxx

2.构建时添加库文件和将库文件一起打包

在项目的构建和运行Build Android APK 中如下设置:

3.在新的项目中调用该库

首先,在项目中引入动态库的头文件

以下是示例代码:

//引入动态库头文件
#include "xxx.h"
//使用动态库中的类
mylib bb;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
          
   


    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint);//
    //调用动态库的方法
    int a=bb.add(15,9);
    QString str = QString::number( a, 10 );
    ui->textEdit->setText(str);
}

MainWindow::~MainWindow()
{
          
   
    delete ui;
}

点击编译运行安卓程序,运行成功!


后面还有复杂的项目通过插件的形式编译动态库

总结

虽然样例比较简单,但我实际过程中也尝试使用过了其他的代码,编写了复杂的逻辑,都是可以使用的。

经验分享 程序员 微信小程序 职场和发展