22 Qt for android里调用so动态库


因大部分android设备都是用arm 处理器,所以动态库都得用arm的编译器才可以. 而且还得用ndk里提供的arm编译器.
ndk里编译器在很深的目录里,它里面有提供一个脚本,把编译器及本身所有的动态库全部集中生成到指定的路径.
  我的ndk目录在"/disk3/adt-bundle-linux/android-ndk-r8d"

  在终端进入ndk目录后:
    ./build/tools/make-standalone-toolchain.sh --install-dir=/opt/android_arm_gcc/

  //执行完毕后, android的编译器及它本身具有的动态库就在"/opt/android_arm_gcc/"目录下了

  设置环境变量:
    vim  ~/.bash_profile  //在最后增加语句
        export PATH=/opt/android_arm_gcc/bin:$PATH
        保存退出后,注消系统后重新登录,以便环境变量生效.

  环境变量生效后,就可以用里面的编译器编译自己的动态库或者移植第三方的动态库.

  我这里是自己编写一个非常简单的测试动态库:
  动态库源码在"/disk3/qt_android_so"

  myadd.h
    #ifndef __MYADD_H
    #define __MYADD_H

    #if defined(__cplusplus)
    extern "C" {
    #endif

        int myadd(int a, int b);

    #if defined(__cplusplus)
    }
    #endif


    #endif /* __MYADD_H */


  myadd.c
    int myadd(int a, int b)
    {
        return a+b;
    }

  编译:
    arm-linux-androideabi-gcc myadd.c -shared -o libmyadd.so

然后在qt源码工程的顶层目录(即pro文件的上一级)右键菜单–> “Add Library” –> “External Library”

这里写图片描述

在上面的窗口填入相应的路径.
确认后,会在pro文件里多生成引用库头文件及库的语句:

unix:!macx: LIBS += -L$$PWD/../../disk3/qt_android_so/ -lmyadd

INCLUDEPATH += $$PWD/../../disk3/qt_android_so
DEPENDPATH += $$PWD/../../disk3/qt_android_so

但是注意,还得通过右键”Add Existing Files …” 导入库头文件

最后还得在下面的界面里加入库,这样库才会与程序一起打包
这里写图片描述

工程里使用库的代码:

#include "myadd.h"

void MyWin::on_pushButton_clicked()
{
    QString str1 = ui->lnd_val1->text();
    QString str2 = ui->lnd_val2->text();
    QString str("%1");

    int ret = myadd(str1.toInt(), str2.toInt());
    ui->lnd_ret->setText(str.arg(ret));

}

编译器配置的参考: http://blog.sina.com.cn/s/blog_bdc128580102uwgd.html

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值