【问题标题】:How to debug Android Studio Project (using NDK and JNI) line by line to see the workflow?如何逐行调试Android Studio Project(使用NDK和JNI)查看工作流程?
【发布时间】:2017-07-10 12:53:17
【问题描述】:

我使用的是 Visual Studio,它的调试机制对我非常有用。在 1 个项目中有许多头文件和 C 文件,只需一个简单的 F10 就可以让我从 main() 函数的开头开始浏览,这样我就可以看到正在执行的代码的顺序。

现在我进入 Android Studio 并从一个使用 NDK、JNI 的项目开始(这个项目例如:https://github.com/googlesamples/android-ndk/tree/master/gles3jni),这让我感到困惑,因为有很多 .java 文件和其他 C++(本机代码)文件,我不知道哪个文件中的哪个代码首先执行以及它是如何进行的。

我的问题是:我正在寻找一种从一开始就在 Android Studio 中逐行调试的方法查看其工作流程喜欢 Visual Studio 的做法,但我从搜索中得到的只是如何调试时从断点开始。

我尝试在启动器活动的onCreate() 方法中设置断点,并使用F8Step OverF7Step Into,但它没有像我预期的那样工作。它一直把我带到超类 Activity.javaGLSurafaceView.java,而不是把我带到 C++ 代码。在 Android Studio 中有什么方法可以做到这一点以及如何做到这一点?

我已经尝试过其他项目,但问题仍然存在。希望有人能帮忙。

【问题讨论】:

  • 你是如何构建你的原生库的?一个小的 sn-p 会很有帮助。
  • @Moved,一切都已经在上面的项目中设置好了。我所要做的就是使用 SDK 管理器安装 CMake、NDK 和 LLBD。一旦所有这些都安装完毕,项目就可以运行了。更多信息可以在这里找到:developer.android.com/ndk/guides/index.html

标签: android-studio debugging android-ndk java-native-interface


【解决方案1】:

这不会发生。您的应用程序(Java 样板代码)设置为响应用户使用应用程序和安装应用程序的设备时发生的许多系统事件。如果你的 c++ 代码是一个单一的简单算法,你可以在开头设置断点,然后一步一步地真正遵循。但是使用 Android Studio,即使这个过程也没有 Vusial Studio 那样简单。首先,它总是远程调试,依赖于精细的通信协议。

也就是说,您可以尝试将 Microsoft Visual Studio 设置为调试原生 Android 代码的 IDE。它出奇的健壮,而且您可能更熟悉。

【讨论】:

  • 非常感谢您的回复。但是,我正在处理的项目有点复杂。它包含通过 JNI 调用的平均数量的 java 代码和一堆 C++ 代码(如 40 个 .cpp 和 .h 文件),是否可以使用 Visual Studio 调试此类项目?顺便问一下,有没有其他方法可以查看使用 Android Studio 的工作流程?还是唯一的办法就是从头开始逐行读取代码?
  • 我认为 40 个文件不会对 Visual Studio 造成很大压力。通过 JNI 调用带来了更严重的挑战:它们本质上会破坏 C++ 的执行流程,并且在 Java 和 C++ 之间切换调试上下文并不容易。我建议更多地依赖可以在“常规”调试器中遵循的独立测试,而不是调试混乱的 Android APK。
  • 就像交叉编译器和远程调试经常出现的情况一样,如果您可以创建可以在 Windows 上的 VS 中调试的重要测试,并且只有在您的核心完全完成时,您的生活就会变得更轻松可靠,迁移到 Android,只需要担心胶水代码和系统相关的工作流程。
【解决方案2】:

既然你问过 Android Studio,我会回答这个问题 - 我不熟悉 Visual Studio for Android,也许它更符合你的要求。

在 Android Studio 中,这样的调试非常困难 - 尽管有人说他们设法让它工作,但我没能做到。尤其是在复杂的环境中。所以,我正在做的是广泛的日志记录,尽可能多的细节,以及可视化调试——在屏幕上放置一些文本视图并用你需要的信息更新它。在某些情况下,这可能非常强大。或者,或者,根据您定义的某些条件在您的 ui 或场景中进行一些更改 - 这样您就可以看到视觉效果。同样,它远不如调试有用,但仍然非常强大。

【讨论】:

  • 感谢您的回复,非常有用的提示。顺便问一下,应用程序运行后编译器从哪里开始?如果我知道从哪里开始,我会更容易理解。
  • 不太清楚您在问什么 - 您想知道可以放置日志的第一个点吗?爪哇? C++?
  • 我想从头看代码,看看怎么走。因此,我的意思是编译器从哪里开始运行它。例如,在 C++ 中,它总是从 main() 函数开始。
  • 仍然不清楚你在问什么 - Java?在 c++ 独立程序中,它是“main”,但在 JNI 上,它是 JNI_OnLoad,如果你实现它的话。在 Android 的 Java 上,您使用的是 SDK 类和基础设施,因此您看不到开始。基本上,Application 类的 onCreate 是您的起点。也看看这里:stackoverflow.com/questions/10057448/…
  • 谢谢,我现在明白了。那我试试onCreate 函数。顺便问一下,您使用的是 facebook、LINE 还是我可以联系的方式?你对我很好,我只是想交朋友:)
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多