Clion配置C++程序用Android NDK编译,并用真机远程调试(临时目录和termux)

这篇具有很好参考价值的文章主要介绍了Clion配置C++程序用Android NDK编译,并用真机远程调试(临时目录和termux)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关键词:ndk, clion, cmake, usb, tcp, ssh, remote debug, remote gdb debug, termux, tabby

前言

假设已经有了一个在windows下能正常编译运行的C++控制台程序,本文仅说明如何在windows下交叉编译到android并调试。C++库类似。

要点提示:

  • 对于unity用户,建议用unity 2022自带的ndk r23。理论上可以用新版,但请找到和版本一致的gdb和gdbserver(r23是有预编译的)

  • 和ndk自带的例子不同,没有app,而是纯粹的控制台程序。无论是上传到临时目录还是termux执行,都不需要root

  • 本文调试基于真机(arm64-v8a,红米,安卓11),如果是虚拟机需要自行修改配置

  • 真机通过USB连接,请使用adb确认已连接成功。理论上可以将本文连接方式改为TCP直接连接,真机设置静态IP

  • 本文使用clion 2023.2,使用其他IDE的读者需要自行探索。对于其他版本的clion,配置可能会有出入,请找到所用版本中最接近的配置

  • 本文忽略了大量细节,仅作为经验笔记供参考,默认读者学习过cmake的命令行使用、cmakelists的编写、linux常用命令、ssh配置和连接等

示例程序(直接改clion新建示例项目):

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;

    int a = 0;
    std::cin >> a;
    if (a == 1) {
        std::cout << "abc";
    } else {
        std::cout << a;
    }
    return 0;
}

编译流程

参考链接 https://www.quarkay.com/code/701/use-clion-and-ndk-to-compile-and-debug-android-executable-binary

  • 找到ndk位置
C:\Program Files\Unity\Hub\Editor\2022.3.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK
  • 在clion工具链中配置关键工具位置

cmake, build tool无所谓,build tool可以不用ndk的make,本文用clion默认的ninja

需要配置C, C++, debugger

C:\Program Files\Unity\Hub\Editor\2022.3.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe
C:\Program Files\Unity\Hub\Editor\2022.3.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe
C:\Program Files\Unity\Hub\Editor\2022.3.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK\prebuilt\windows-x86_64\bin\gdb.exe
  • 继续配置CMake
-G Ninja 
-DCMAKE_TOOLCHAIN_FILE="C:\Program Files\Unity\Hub\Editor\2022.3.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK\build\cmake\android.toolchain.cmake"
-DCMAKE_SYSTEM_NAME=Android
-DANDROID_ABI=arm64-v8a
-DCMAKE_ANDROID_NDK="C:\Program Files\Unity\Hub\Editor\2022.3.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK"
-DANDROID_PLATFORM=android-30
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang

全部配置完成后就能直接编译。这部分配置可能需要简化或补充,感兴趣的读者可以进一步研究。

  • 编译成功后直接用adb传到手机上执行,参考命令如下
adb shell rm -rf /data/local/tmp/androidtest
adb shell mkdir /data/local/tmp/androidtest
#adb shell ls /data/local/tmp
adb push ./bin/androidndktest /data/local/tmp/androidtest
adb shell chmod a+x /data/local/tmp/androidtest/androidndktest
adb shell /data/local/tmp/androidtest/androidndktest

远程调试流程

  • 上传gdbserver到临时目录

找到gdbserver位置

C:\Program Files\Unity\Hub\Editor\2022.3.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK\prebuilt\android-arm64\gdbserver

切换到该文件夹输入以下命令

adb push gdbserver /data/local/tmp/
adb shell chmod a+x /data/local/tmp/gdbserver
  • 端口转发并启动调试服务
adb forward tcp:11015 tcp:1234
adb shell /data/local/tmp/gdbserver 0.0.0.0:1234 /data/local/tmp/androidtest/androidndktest
  • 在clion配置Remote Debug

debugger:选择上文的ndk自带debugger gdb

‘target remote’ args:tcp:127.0.0.1:11015

  • 在想要的位置打断点,假设是在cin之后,那么在打开了adb shell的窗口(不是clion内置的控制台)中输入任意数字后按下回车就会命中断点
  • 至此已完成普通的调试

自动远程调试流程

预备:termux,ssh(tabby)

  • 用端口反弹,将termux sshd命令公开的端口反弹到本地,ssh配置方法和网上相同
adb forward tcp:11016 tcp:8022
  • 在用tabby测试连接成功后,tabby配置好sftp,确保功能正常

参考链接:https://github.com/Eugeny/tabby/wiki/Shell-working-directory-reporting

下文将作出以下假设:

用户名:u0_a370(ssh密码自己设)

主目录位置:/data/data/com.termux/files/home

  • 用tabby的sftp上传gdbserver到远程位置,并改变执行权限,可以手动运行一遍看看是否成功
chmod a+x ./gdbserver

假设最终gdbserver的位置为

/data/data/com.termux/files/home/gdbserver

实际上在这一步,就可以将编译产物(本文为androidndktest)用sftp上传到主目录位置并执行。

chmod a+x ./androidndktest
./androidndktest

如果执行失败,请先排查原因,也有可能是本文所述的方法不具有普遍性,仅供参考。

  • (重点)配置clion的Remote GDB Server

新建一个,然后填入以下配置

Target和Executable选择要调试的程序androidndktest
GDB选择上文提到的gdb.exe完整路径
Credentials建立ssh连接
Upload Executable选择Always
Upload path: /data/data/com.termux/files/home/tmp/CLion/debug
‘target remote’ args: 127.0.0.1:11015
GDB Server: /data/data/com.termux/files/home/gdbserver
GDB Server args: :1234 /data/data/com.termux/files/home/tmp/CLion/debug/androidndktest

  • 配置完成,应该能进入调试了。假设断点打在cout。clion的调试控制台好像无法输入。如果有需要只能自己重定向输入到文件。

效果如图
clion配置ndk,c++,android,开发语言,idea,adb,unity,安卓

clion配置ndk,c++,android,开发语言,idea,adb,unity,安卓文章来源地址https://www.toymoban.com/news/detail-833373.html

到了这里,关于Clion配置C++程序用Android NDK编译,并用真机远程调试(临时目录和termux)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    1.首先认识一下NDK。 (1)什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,

    2024年02月11日
    浏览(47)
  • android ndk一些编译链接错误及解决办法

    链接opencv库时报链接错误缺少libz库 解决,mediann是本人所编译库的名字 链接librknnrt.so时报 解决 使用的是aarch-linux的库,报错换成android版本的librknnrt.so即可 链接opencv库时报错缺少jnigraphics 解决 链接opencv库时报错确实mediandk 解决 链接opencv时报很多std的链接错误 解决 ndk版本太

    2024年02月09日
    浏览(48)
  • Android-NDK的linux交叉编译环境

    NDK 下载  |  Android NDK  |  Android Developers https://github.com/android/ndk/wiki/Unsupported-Downloads 以android-ndk-r26c下载为例,下载后将压缩包解压至/usr目录下 编译平台变量判断条件中增加一下android条件下CMake的变量 详细变量设置参考 C++ 库支持  |  Android NDK  |  Android Developers 编译出的程

    2024年04月10日
    浏览(42)
  • 【Android】Ubuntu20.04编译Android 13并用模拟器运行

    一直好奇Android系统是怎么定制的,直到亲自走一遍Android系统编译流程才发现并没想象的复杂。 这就跟app开发一样,Google官方其实都提供了平台、文档、IDE及一些工具,咱们只要按照官方提供的指南来操作就行了。 如果Android没有提供这样一个开放的系统、完善的生态,咱们

    2024年02月04日
    浏览(45)
  • android ndk clang交叉编译ffmpeg动态库踩坑

    1.ffmpeg默认使用gcc编译,在android上无法使用,否则各种报错,所以要用ndk的clang编译 2.下载ffmpeg源码 修改configure文件,增加命令 cross_prefix_clang 修改以下命令 修改后 3.新建脚本文件,ffmpeg目录下执行脚本文件即可。 编译32位,则ARCH改为arm,CPU改为armv7-a,TARGET改为armv7a-linux-

    2024年02月13日
    浏览(45)
  • Android ffmpeg入门(1)—— 使用NDK交叉编译ffmpeg集成到Android项目

    最近在学习android NDK开发相关内容,借ffmpeg练练手。ffmpeg是做音视频方面功能的基础,后面会随着个人的学习更新一系列ffmpeg博客,防止自己遗忘。 这个系列博客主要目的是基于ffmpeg通过NDK开发的方式完成一个基本的视频播放器。 本篇博客主要实现了 ffmpeg编译 以及 引入 a

    2023年04月08日
    浏览(39)
  • Android JNI系列详解之CMake和ndk-build编译工具介绍

    一、前提 CMake和ndk-build只是编译工具,本次主要介绍ndk-build和CMake的区别,下节课介绍他们的使用。 二、CMake工具介绍 CMake:cross platform make,是跨平台的编译工具 CMake是在AndroidStudio2.2之后引入(目前默认的NDK编译工具),使用时配合CMakeList.txt和gradle。 对C++的配置: 默认配置

    2024年02月12日
    浏览(34)
  • 在M2芯片上配置Clion编译和下载stm32

    本文以我在M2 pro芯片的Mac os系统上配置Clion来完成我学习和开发stm32工程的经历,分享在配置过程中的问题和解决。本文当然不限于M2芯片,而是对于整个Apple Sillicon ARM芯片的mac电脑适用。 首先中,无论是windows还是macOS,使用Clion配置stm32环境都需要你安装stm32CubeMX,当然安装

    2024年01月23日
    浏览(38)
  • 反编译(混淆)的微信小程序使用苹果ios真机调试时报错VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM,安卓(android)一切正常

    改反编译混淆的小程序语法写错了也会报这个错误: 报错原因很可能是你哪个地方改的(或写的)有问题,语法错误、变量未定义、使用了不存在的参数。 我这里是使用了 console.table() 方法 出错原因:IOS上的Webview并不支持 console.table() 方法,因此会导致代码无法运行。

    2024年02月12日
    浏览(50)
  • Qtcreator 编译报错 Project ERROR: You need to set the ANDROID_NDK_ROOT...

    环境:银河麒麟v10 sp1 +Qt5.14.2 手贱不知道点了什么.编译项目就报一片error,看着贼烦. Project ERROR: You need to set the ANDROID_NDK_ROOT environment variable to point to your Android NDK. Could not read qmake configuration file /opt/Qt5.14.2/5.14.2/android/mkspecs/android-clang/qmake.conf. 查资料大概和ANDROID_NDK_ROOT 环境变量

    2024年02月02日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包