当前位置: 首页 > news >正文

windows+cmake+vscode+NDK远程调试安卓端C++项目

windows+cmake+vscode+NDK远程调试安卓端C++项目

  • windows+cmake+vscode+NDK远程调试安卓端C++项目

windows+cmake+vscode+NDK远程调试安卓端C++项目

使用C++开发安卓端算法库时,需要使用NDK进行交叉编译。使用NDK编译代码时,需要编写.mk脚本进行代码的编译和链接,比较繁琐,因此可以借助cmake和NDK工具链组织项目,只需要在根目录的CMakeLists.txt中调用NDK工具链就可以进行交叉编译,无需学习NDK编译脚本的语法,并且仍然可以发挥cmake 的特长。

在这片文章中,我们不介绍如何使用cmake+NDK进行交叉编译,认为读者已经有这方面的基础。这部分相关的内容可以阅读这个系列中的其他博文。
本文主要介绍如何使用NDK的调试工具,在windows上调试C++项目,而C++项目实际是在安卓手机上运行的。


  1. 假设我们已经有了一个完整的C++ + cmake +NDK编译的项目。
  2. 编写一个build.bat脚本,用于自动进行cmake构建
@echo off
if exist "./build" (
    rmdir /s /q "./build"
    echo Folder deleted successfully.
) else (
    echo Folder not found.
)
set current_path=%cd%

@REM call cmake --no-warn-unused-cli -DCONFIG=android_qcom_arm64 -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -S . -B ./build -DCMAKE_MAKE_PROGRAM=%current_path%\ninja\ninja -G "Ninja"
call cmake --no-warn-unused-cli -DCONFIG=android_qcom_arm64 -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -S . -B ./build -DCMAKE_MAKE_PROGRAM="D:\msys64\mingw64\bin\mingw32-make.exe" -G "MinGW Makefiles"
call cmake --build ./build --config Debug --target all --

脚本中的路径自行替换

  1. 编写run.bat脚本将编译后的库文件和可执行文件push到手机端,同时将gdb工具push到手机端。其中gdb工具位于NDK安装目录下“android-ndk-r23/prebuilt/android-arm64/gdbserver/gdbserver”。
adb root
adb remount

adb shell rm -rf /data/tmp/
adb shell mkdir /data/tmp/
adb push ./build/bin/testbed /data/tmp/
adb push ./build/sharedLib /data/tmp/
adb push "D:/android-ndk-r23/prebuilt/android-arm64/gdbserver/gdbserver" /data/tmp/

adb shell ls /data/tmp/
adb shell chmod -v 777 /data/tmp/testbed
adb shell chmod -v 777 /data/tmp/gdbserver

adb forward tcp:9090 tcp:9090

set env=export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/tmp/sharedLib
@REM adb shell "%env% && /data/tmp/testbed"
adb shell "%env% && /data/tmp/gdbserver :9090 /data/tmp/testbed"
  1. -在工程中创建.vscode文件夹,在该文件夹下创建launch.json和task.json这两个文件t。task.json文件内容如下,其中上述两个bat脚本都放在工程的根目录下
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "cmd",
            "args": [
                "/c",
                "${workspaceFolder}/build.bat"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "run",
            "dependsOn": ["build"], // 指定要依赖的任务列表
            "type": "shell",
            "command": "start cmd",
            "args": [
                "/c",
                "${workspaceFolder}/run.bat"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
    ]
}

launch.json文件内容如下:其中在"program": “${workspaceFolder}/build/bin/testbed”,指定本地可执行文件的路径;在"miDebuggerPath": “D:/android-ndk-r23/prebuilt/windows-x86_64/bin/gdb.exe”,指定本地NDK的gdb路径

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/bin/testbed",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "serverLaunchTimeout": 1000,
            "filterStderr": true,
            "filterStdout": true,
            "serverStarted": "GDB server started on port",
            "miDebuggerPath": "D:/android-ndk-r23/prebuilt/windows-x86_64/bin/gdb.exe",
            "miDebuggerServerAddress": ":9090",
            "preLaunchTask": "run",
        }
    ]
}

启动vscode中的运行->启动调试开始调试程序,此时会弹出一个外部的windows终端。这样一来就可以在windows上打断点,查看变量了。但是代码实际上是在手机上运行,只是通过gdbserver将调试信息从手机端发送到vscode上。

相关文章:

  • 回文日期1
  • 泛微ECOLOGY9 记 数据展现集成 自定义开窗测试中对SQL 的IN语法转换存在BUG
  • Linux中OS的管理和进程的概念
  • 【力扣hot100题】(087)乘积最大子数组
  • LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, 字符集转码/字符集探测
  • IO流——字节输入输出流:FileInputStream FileOutputStream
  • 视频内容原数据获取接口开发指南
  • 直线模组过载使用会有什么效果?
  • 数据驱动的温暖守护:智慧康养平台如何实现 “千人千面” 的精准照护?
  • Python 根据多个下标向列表中插入对应的值的巧妙方法:逆序插入
  • React8+taro开发微信小程序,实现lottie动画
  • 编程规范(c++)
  • ecovadis评分要求,如何提高ecovadis分数,未来展望
  • GitHub 趋势日报 (2025年04月10日)
  • STM32嵌入式开发从入门到实战:全面指南与项目实践
  • 《Vue Router实战教程》19.滚动行为
  • 原生多模态大模型时代:统一感知的智能跃迁
  • Vue 3 国际化实战:支持 Element Plus 组件和语言持久化
  • Git开发
  • 【Java集合】TreeSet、TreeMap源码解读
  • 网站优化需要什么/网络推广内容
  • 青岛做网站的公司哪个好/怎么在百度发布信息
  • 微信小程序开发者中心/郑州seo关键词优化公司
  • 诸城网站建设公司排名/长沙网站seo公司
  • 凡科网的网站建设好用吗/如何快速网络推广
  • 可以看帖子的网站/重庆seo