繁体   English   中英

如何在NDK本机代码中获取断点并在Android Studio中调试本机代码?

[英]How to get breakpoint in NDK native code and debug native code in Android Studio?

我正在使用NDK开发Android应用程序。 我有两个项目。 一个是我的本机库,它使用NDK并生成.so文件。

我正在使用Android Studio,但是使用ndk-build禁用自动构建和启用构建。 我使用的是Windows 7。

现在生成.so文件后,我复制了我的主应用程序项目中的那些,它也使用ndk-build编译JNI函数,我在其中调用我的库的函数。 我希望到目前为止我很干净。 如果没有,那么我会根据要求提供更多细节。

现在我正在使用Android Studio在设备中运行我的应用程序,我可以在java代码中设置断点并调试该代码,但我无法调试JNI调用以及我在单独项目中的本机代码。 我需要调试我的库代码。 有没有办法实现这个目标?

我见过VisualGDB,但付费。 所以让我知道是否有任何替代方案来满足我的调试要求。我已经搜索了很多但没有得到任何具体的解决方案。

我可以看到Android Studio中的选项附加到android进程,我可以看到我的运行设备,但我不知道如何使用它,所以我可以通过本机库代码进行调试(这是在没有任何活动的单独项目中)。

如果需要更多详细信息,请与我们联系

在Android Studio 2.0预览中,这个过程有点不同(我认为更容易):

  1. 安装“LLDB” :进入工具 - > Android-> SDK管理器,然后进入“SDK工具”选项卡,确保选中“LLDB”(通常在列表末尾附近)
  2. 选择一个/“Debug”变体 :在AS的左下角,单击“Build Variants”,默认调试变量称为“Debug”
  3. 选择本机配置 :运行按钮的左侧(绿色三角形),默认本机配置称为“app-native”
  4. 设置断点
  5. 通过单击运行按钮右侧的小错误启动调试中应用程序

如果它不起作用,请检查您的本机配置是否选择了调试类型“Hybrid” :在播放按钮的右侧,单击小三角形,选择“编辑配置”,选择“app-native”配置,进入在“Debugger”选项卡中选择“Debug type:Hybrid”。

Android Studio 1.3+支持本机调试。

要进行设置,请按以下步骤操作:

  1. 修改gradle-wrapper.properties,local.properties和build.gradle文件,如本指南所示
  2. 同步gradle
  3. 创建并选择新的构建配置:

    单击运行按钮旁边的下拉菜单 - >编辑配置,单击加号,选择Android Native,在右侧填写选项(我在本机调试器选项卡中使用LLDB),您应该设置。

  4. 在C ++中设置断点

  5. 点击调试按钮并耐心等待(有时调试器需要一段时间)

我已经能够使用Android Studio 1.3(稳定通道)在Lubuntu 14.04下调试本机代码。 虽然其他人在Windows下已经取得了成功,但我还是无法在Windows 8.1中进行原生调试 (我已尝试使用Android Studio 1.3,1.3.2和1.4预览版3)。

更新 Android Studio 1.4 Beta刚刚问世。 我测试了它,并且能够在Windows 8.1上进行原生调试。

我能够设置断点并进入本机代码,但只有满足以下所有条件时:

  1. 生成的本机库.so文件保留了它们的调试符号
  2. 提供了来源(参见“库属性”菜单)
  3. 我设置运行/构建配置为使用机调试器(如所描述的在这里

它现在在Android Studio 1.5中使用Gradle Experimental Plugin

如果本机代码中的断点不起作用的另一个检查点:

  • 删除android:extractNativeLibs="false"行或在AndroidManifest.xml中将其设置为true

extractNativeLibs="false"偶尔会导致1或2。

  1. 安装将失败,并显示消息“INSTALL_FAILED_INVALID_APK”
  2. 本机代码中的断点不起作用

如果您尝试了所有内容之后仍然无法获得本机断点,并且您的本机库已被多个AS项目引用,那么就有一个简单的解决方案。

只需在setting.gradle和build.gradle中重命名本机库

之前:

//in setting.gradle
include ":myNativeLib"
project(":myNativeLib").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib')

后:

//in setting.gradle
include ":myNativeLib2"
project(":myNativeLib2").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib2')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM