本文以在Android App工程中依赖xhook为例,记录如何在CMakeLists.txt中依赖外部第三方so库。

编译xhook

1 下载xhook源码

git clone https://github.com/iqiyi/xHook.git

2 修改支持的abi

cd xHook

xHook 支持armeabi, 需要使用android-ndk 16, 因为android-ndk 17以上已经不支持armeabi了。如果不需要armeabi,并且使用高版本的android-ndk,可以去掉xHook对armeabi的支持。

打开 ./libxhook/jni/Application.mk删除armeabi:

3 编译xhook

执行以下命令,编译xHook:

./build_libs.sh

该脚本会调用ndk-build命令,需要先将ndk的目录配置在~/.bashrc中:

export PATH=/home/zhangjg/tools/android-ndk-r21:$PATH

./build_libs.sh 执行完成之后,会输出armeabi-v7a, arm64-v8a,x86,x86_64的so:

将xhook加到项目中

1 将libxhook/libs目录拷贝到项目中

拷贝到CMakeLists.txt文件所在的目录, 一般为app/src/main/cpp中:

2 将xhook.h拷贝到项目中

为了方便配置,直接将xhook.h拷贝到app/src/main/cpp中,和CMakeLists.txt在同级目录:

3 依赖xhook.h写hook的逻辑

#include "xhook.h"static void fake_abort() {LOGI("fake abort");
}static void do_hook() {xhook_register("ibchrome.so", "abort", (void *)fake_abort, nullptr);xhook_refresh(0);
}

编译以上代码,发现链接错误:

[2/2] Linking CXX shared library /home/zhangjg/AndroidStudioProjects/BLEDemo/app/build/intermediates/cmake/debug/obj/arm64-v8a/libble_compat.so
FAILED: /home/zhangjg/AndroidStudioProjects/BLEDemo/app/build/intermediates/cmake/debug/obj/arm64-v8a/libble_compat.so
: && /home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android26 --gcc-toolchain=/home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security   -std=c++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libble_compat.so -o /home/zhangjg/AndroidStudioProjects/BLEDemo/app/build/intermediates/cmake/debug/obj/arm64-v8a/libble_compat.so CMakeFiles/ble_compat.dir/ble_compat.cpp.o  /home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26/liblog.so /home/zhangjg/.gradle/caches/transforms-2/files-2.1/bba815dfd2e33446c27bb2585a849af4/jetified-xdl-1.0.4/prefab/modules/xdl/libs/android.arm64-v8a/libxdl.so -latomic -lm && :
CMakeFiles/ble_compat.dir/ble_compat.cpp.o: In function `do_hook()':
/home/zhangjg/AndroidStudioProjects/BLEDemo/app/src/main/cpp/ble_compat.cpp:133: undefined reference to `xhook_register'
/home/zhangjg/AndroidStudioProjects/BLEDemo/app/src/main/cpp/ble_compat.cpp:134: undefined reference to `xhook_refresh'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

我们都知道,c/c++代码的构建分为编译和链接两个部分,编译期间依赖的头文件xhook.h是没有问题的。但是链接的时候,即使我们自己的so是动态链接到libxhook.so,连接器ld也是要找到libxhook.so,去检查libxhook.so中的符号,以确保我们自己的so中的符号,需要做静态链接还是动态链接。

以上错误就是因为链接器不知道去哪里找libxhook.so。

需要在CMakeLists.txt中加入相关的配置:

add_library(xhook SHARED IMPORTED)
set_target_properties(xhook PROPERTIES IMPORTED_LOCATION${PROJECT_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}/libxhook.so)target_link_libraries(ble_compat xhook)

add_library(xhook SHARED IMPORTED)

这句话的意思是,定义一个库,这个库需要有一个名字xhook,这个名字可以被其他库依赖。

set_target_properties

这句话是对xhook这个库进行配置,主要是配置它的so的路径。${PROJECT_SOURCE_DIR}就是当前CMakeLists.txt文件所在的路径app/src/main/cpp${CMAKE_ANDROID_ARCH_ABI}就是当前编译任务对应的abi(armeabi-v7a, arm64-v8a, x86, x86_64)。

上面的两句代码定义了xhook这个库,并且指定了这个库的so的位置。

target_link_libraries(ble_compat xhook)

这句话说明当前的模块ble_compat需要链接到xhook这个库。

加上上面的代码后,就可以编译通过了。

并且在打包apk的时候,会自动把libxhook.so打进去。

我之前不会配置如何链接外部第三方so,就在网上搜了很多资料,很多都是使用link_directories()配置的,都不生效。

CMake依赖第三方so库相关推荐

  1. iOS架构-静态库.a之依赖第三方静态库.a的制作(8)

    上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库.而有时我们会依赖第三方.a 或者.framework 的.那么怎么样来制作依赖第三方.a 或者.frame ...

  2. android jni通过cmake使用第三方静态库和动态库

    google 官方现在推荐使用cmake来构建jni. 本人正好工作需要使用第三方的静态库和动态库,写此文 权当做个记录. 首先修改app的build.gradle文件 ndk {abiFilter ...

  3. iOS架构-静态库.framework之依赖第三方库(7)

    需求分析:     把自己的能力封装成静态库提供给客户使用,但是有些工作市场上已经有很好的公开的代码,或者成本很低的解决方案,我们就可以使用别人公开的.或者低成本采购的技术来为我们服务.制作静态库也是 ...

  4. (转载)Android studio 导入或依赖第三方库失败

    Android studio 导入或依赖第三方库失败 原文链接 在使用第三方库的时候,需要添加很多仓库,以保证可以能正确快速的下载到我们所需要的类库,但是经常会出现各种问题. 以下为个人问题总结 首先 ...

  5. 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)

    程序的编写需要用到头文件,程序的编译需要lib文件,程序的运行需要dll文件,因此cmake引入第三方库其实就是将include目录.lib目录.bin目录引入工程.         目录 1.fin ...

  6. 使用cmake在自己的jni中倒入第三方so库遇到的问题

    在cmake中倒入第三方库的时候遇到问题,记录下来,以便下次查看: 1,这里的路径不能写错 2,为了方便cmake中路径的写入,最好把camkelists提到app目录下 3,第三方的.so库不能带$ ...

  7. android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)

    需求 现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库. 方案 创建Andro ...

  8. bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解

    Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...

  9. python第三方库有哪些-我常用的几个第三方 Python 库

    我常用的几个第三方 Python 库 今天公司停电,没上班.跑上来更新个博客,跟大家分享一下我常用的几个第三方 Python 库.Python 语言之所以能够如此流行,除了本身内置许多程序库来保障快速 ...

最新文章

  1. 【跃迁之路】【530天】刻意练习系列289(2018.07.20)
  2. Django-cookie的保存以及删除操作
  3. Unity进阶技巧 - 从文件读取游戏数据
  4. 几道web前端练习题目
  5. mysql 数据类_MySQL数据类型
  6. Tensorflow 卷积神经网络(三)池化与采样
  7. 洛谷 P1843 奶牛晒衣服 1
  8. 【操作系统/OS笔记11】并发执行的必要性,产生的问题,原子操作,为什么引入锁机制,面包购买的类比
  9. [学习整理]eclipe/MyEclipse:重要的快捷键
  10. vb.net 教程 6-1 进程 Process类初探
  11. 联想智能云教室_被低估的联想能复制微软之路吗? | 公司观察
  12. stc51单片机串口通信程序
  13. matlab 维纳滤波器算法实现
  14. unity让物体做圆周运动、椭圆运动、双曲线运动
  15. oppo计算机找不到,oppo手机照片在电脑显示不出来怎么办啊
  16. c语言程序撩女朋友,撩女朋友的套路情话 绝对让她对你死心塌地
  17. sun.net.ftp.FtpClient介绍
  18. Vue实战篇三十五:实现滑动拼图验证登录
  19. python3-张子枫图片爬取
  20. CanOpen学习笔记5-- CanFestival使用提示

热门文章

  1. 小清新教学课件PPT模板
  2. React Native TEXT 组件文字显示不全 异常解决(小米文字显示不全:小米10 ,Redmi k30出现)
  3. 寝室环境对大学生睡眠的影响调查
  4. windows下hadoop对lzo的支持
  5. 戴尔微型计算机如何拆,戴尔的拆机方法介绍【图文教程】
  6. Recurdyn履带车辆动力学分析
  7. 处理Vue中相同组件不同路径的页面重新渲染
  8. 计划写Redis的源码分析笔记
  9. 微信分享默认logo修改
  10. 读《富兰克林自传》的一些体会