Qt Andriod 在Windows系统下编译和添加动态库(一)
前言
因为项目实际需求,在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;
}
点击编译运行安卓程序,运行成功!
后面还有复杂的项目通过插件的形式编译动态库
总结
虽然样例比较简单,但我实际过程中也尝试使用过了其他的代码,编写了复杂的逻辑,都是可以使用的。
