如何使用 Android Studio 2.2.3 调试外部原生库的 C++ 源代码?

How can I debug C++ source code of an external native library using Android Studio 2.2.3?

提问人:Liang Jian 提问时间:3/5/2017 最后编辑:shizhenLiang Jian 更新时间:8/12/2023 访问量:2532

问:

我在 Windows 10 下有一个由 Android Studio 2.2.3 创建的 android 项目,该项目通过其包装 jar(通过 JNI)使用本机库。原生库是由 qmake 在 Android Studio 之外构建的,它将使用 android NDK r13b 中的 GCC 4.9 来生成原生共享库,代码是使用 option 编译的。-g

为了使用这个原生库,我把包装 jar 放在目录下,把原生库放在目录下,一切正常,我可以从 java 代码成功调用原生库中实现的方法。<proj_path>/app/libs<proj_path>/app/src/main/jniLibs/armeabi-v7a

问题是我在调试这个android项目的时候,在cpp文件中设置的断点没有生效,请注意cpp文件不在android项目的源码树中,我只是从android studio打开它。我已经安装了最新的LLDB,并且使用“混合”调试类型开始调试,我还使用“image list”LLDB命令来确认调试时加载的本机库映像是未剥离的版本。但断点就是不会命中。

我的配置有什么问题?

有人可以给我一些建议吗?

谢谢!

C++ 调试 android-ndk java-native-interface

评论

0赞 AndreaT 10/5/2017
你有什么消息吗?我想我有同样的问题。我读过很多关于这个问题的帖子,但我没有找到任何真正的解决方案。我还发布了一个问题,因为几天前我没有在这里发表评论的声誉。谢谢。
0赞 Ciro Santilli OurBigBook.com 11/6/2017
相关新闻: stackoverflow.com/questions/8674434/...
1赞 shizhen 12/13/2018
Android JNI 调试不支持调试原生库,您必须附上 C/C++ 源代码。
0赞 James S 5/2/2023
一定要将源代码添加到您的项目中,并确保安装了其依赖项。

答:

-1赞 Hack06 5/3/2020 #1

如果您的程序在预编译代码上运行,您如何期望 AndroidStudio 命中断点?如果您在源代码中放置断点,例如在Notepad ++应用程序中,情况也是一样的。相反,你必须告诉你的项目/代码使用源代码,而不是预编译的库。为此,请删除所有 .so 文件并链接源代码,以便 NDK 从那里编译。

编辑:
显然,旗帜是我错过的神奇部分。对于想要深入了解此标志的人来说,这里有一些参考作为起点: https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_16.html 就我个人而言,我从来不需要它,但对于其他一些情况来说,它可能很方便。虽然不确定 Android Studio 是否支持它。无论如何,干净的方法仍然是将源代码包含在 NDK 应用程序中,以便进行调试,并确保调试的内容;)
-g

评论

1赞 arsdever 6/29/2023
-1 因为:您可能已经在项目之外的调试模式下编译了源代码(如问题中提到的“它是用标志构建的”),并尝试在 Android Studio 中调试,同时正常解析符号。我不是特别确定它是如何完成的,但这绝对是可能的。-g
0赞 Hack06 8/12/2023
谢谢,我不知道有这种可能性来调试带有 -g 标志的预构建可执行文件。我会更新我的答案。