是否可以在 Android Studio 中调试 C/C++?

Is it possible to debug C/C++ in Android Studio?

我正在编写一个 Android 应用程序,其中包含与 Java 代码一起编译的 C/C++ 代码。我的应用程序在执行本机代码期间崩溃。

有没有一种方法可以通过 Android C/C++ 源并检查变量,就像 Java 源一样?

我不一定要寻找一种方法来从 Android Studio 中单步执行源代码 。这显然是理想的解决方案,但是,如果我在从 Studio 启动应用程序后需要使用外部工具,那很好。我希望能够逐行执行并检查变量。

Android Studio 1.0.2
AndroidNDK r10d

编辑:根据 "Use Eclipse with ADT plugin" 的即时响应,让我添加更多要求。
这个项目作为一个 Eclipse ADT 项目开始。但是,我现在已经迁移到 Android Studio。我的项目现在是使用 Gradle 构建的,我的项目目录结构反映了这一点。我愿意使用 Eclipse;为了从 Android Studio 恢复到 Eclipse,我 愿意更改我的项目结构。如果有在Eclipse中打开AndroidStudio项目并调试的方法,请详细说明过程。

[更新]

截至 2015 年 7 月,Android Studio 支持 NDK。

您可以在 this link 上了解更多信息。


[旧] Android Studio 尚不支持 NDK。

当我们不得不和NDK打交道时,唯一的解决办法就是使用Eclipse。

编辑

我们基本上保留了具有 NDK 功能(在我们的例子中是地图)的 Eclipse 项目和具有其他(非地图)功能的 Gradle 项目。所以所有必须用 NDK 完成的事情,我们都在 Eclipse 中完成,然后将更改包含到 Gradle 项目中。

更准确地说,在目录 /src/main/ 中,我们创建了另一个名为 jniLibs 的目录,并将编译后的 *.so 文件放入特定于体系结构的文件夹(armeabi-v7a、armeabi、x86 ...)。然后在 Gradle 项目的主 class 中简单地添加了一行

static {
    System.loadLibrary("OurNDKLibName");
}

每个项目只能添加一次此行。也许我错了,但我们这样做没有任何问题。

自版本 1.3+ 预览版 Android Studio 支持 C++ 调试,引用 Android M Developer Preview & Tools:

Most notable is a much requested feature from our Android NDK & game developers: code editing and debugging for C/C++ code. Based on JetBrains Clion platform, the Android Studio NDK plugin provides features such as refactoring and code completion for C/C++ code alongside your Java code. Java and C/C++ code support is integrated into one development experience free of charge for Android app developers.

使用来自 tools.android.com 的 Android Studio 1.4,可以进行调试。当你 open/create 一个包含 C++[jni] 代码的项目时,Android studio 会创建一个新的配置,比如 $(module_name)-native

我会 select 此配置、同步 gradle、构建、设置断点等,然后 运行 使用 Android Studio。等了好久,我的debugger连上了,app broken in了[我觉得这时候你也可以设置断点];这个断点不在我设定的断点处,我在 android 工作室让它去,我的断点被击中。希望这有帮助
Some samples 应该与 android 调试器一起工作

不是不是效果不是很好。

hello-jni 失败 失败:

Starting LLDB server: run-as com.example.sample 
/data/data/com.example.sample/lldb/bin/start_lldb_server.sh 
    /data/data/com.example.sample/lldb 
        /data/data/com.example.sample/lldb/tmp/platform.port1442695333842 "lldb 
    process:gdb-remote packets"
Error while launching debug server on device: 
    com.android.tools.ndk.run.DebuggerContext$StartServerException: 
        java.lang.IllegalStateException: Failed to read platform port 
            /data/data/com.example.sample/lldb/tmp/platform.port1442695333842

我使用的是 1.4RC1

compileSdkVersion 23
buildToolsVersion "23.0.1"

以及@Gerry 提到的 "app-native" 运行 配置。它快到了,但我在我的应用程序的私有数据文件夹中找不到 lldb 目录的踪迹。我确实在从那里链接的 lib 目录中找到了一个 400kb gdbserver,旁边还有我自己的 *.so。不幸的是,从 1.3 升级到 1.4 时,使用 gdb 而不是 lldb 进行调试的选项已经消失。 NDK 10e 在 ndk\prebuilt\android-arm\gdbserver 中提供了一个 400kb 的 gdbserver 二进制文件(我猜)。 9 月 15 日更新了 gdb debug howto https://github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB。这比 logcat 调试 IMO 更难,但这是一个当前的话题,很抱歉这么消极,但我不相信 lldb 真的有效。

我有 运行 hello-jni 得出了同样的结论。

因此,在回答您的问题时,尚无法在 Android Studio 中调试 C/C++。抱歉,这不是您希望的答案,我希望能用确凿的相反证据证明我是错误的,但就在这里,就在此时,没有机会了!

UPDATE 我提出了一个 issue 并得到了一个 phone.

的修复

UPDATE2 下结论还为时过早,毕竟它是实验性的,但我偶尔会无法连接,经常(如果不是总是)乱序步进和参数值无意义的断点.我只是设置了一个没有触发的条件断点,但 logcat 显示它应该触发。最初我认为这是我的逻辑错误,但它更深。

简单地设置断点非常有用,但距离 Java 调试或 Vis Studio C++ 调试还有一百万英里。

UPDATE3 回到稳定的 1.3.1,因为 canaray 频道版本在每次击键时暂停上厕所。虽然本机调试版本至少与我的 "fixed" phone 一起启动,但即使在 hellojni 中也没有断点,或者稍微扩展的版本提供更多机会。我现在习惯了 logcat,但在使用 Android、NDK 和 Eclipse 时有更好的调试经验。更精细的解决方案也更容易破解,但至少它 有效 .

,Android Studio 至少支持 Android studio 1.5.1 和 android-ndk-r10e 的 C++ 调试。

在过去,您必须按顺序编写 make 文件 Android.mkApplication.mk在 Android Studio 中构建 C++ 代码。你不再需要它们了。只要把它们放到jni文件夹下,gradle就能拿来编译。您应该会看到如下内容:

并且还允许您设置断点和调试它。

你应该关注 this step-by-step tutorial and learn more about it. And read more about the documentation here. I've uploaded a complete working example so that you can download and try it out on GitHub


是的!可以在 android studio 中调试本机代码。从更新开始 Android Studio 2.2+ 支持用于调试本机代码的内置工具。