ubuntu下qt for android 调用自己的C动态库至安卓平台(ARM)

转载链接: link.
自己记录修改一下,防止博主管理博客时删掉,以后就没得看了。。。
问题起源:
(1)在ubuntu下自己写一个myadd函数并生成动态库;
(2)通过qtcreator Desktop Qt构建套件调用so动态库正常;
(3)通过qtcreator Android for armeabi-v7a构建套件直接调用该so报错👎 error: error: cannot find -lmyadd(我想直接在安卓上调用该so,看来行不通)
解决办法:

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

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

执行完毕后, android的编译器及它本身具有的动态库就在"/opt/android_arm_gcc/"目录下了,在这一步提示权限问题,设置一下opt的权限
设置环境变量:
vim ~/.bash_profile //在最后增加语句
export PATH=/opt/android_arm_gcc/bin:$PATH
保存退出后,注消系统后重新登录,以便环境变量生效,我这里直接修改profile文件。

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

//myadd.h
#ifndef __MYADD_H
#define __MYADD_H

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

double myadd(double a, double b);

#if defined(__cplusplus)
}
#endif

#endif /* __MYADD_H */

//myadd.c

#include "myadd.h"
double myadd(double a, double 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/../MyAdd/ -lmyadd

INCLUDEPATH += $$PWD/../MyAdd
DEPENDPATH += $$PWD/../MyAdd

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
    ANDROID_EXTRA_LIBS = \
        $$PWD/../MyAdd/libmyadd.so
}

导入头文件进行调用测试,最后还得在【构建设置】->【build android apk】->【additional libraries】里加入库,这样库才会与程序一起打包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值