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

时间:2015-02-19 09:05:58

标签: android android-studio android-ndk

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

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

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

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

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

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

如果需要更多细节,请告诉我

5 个答案:

答案 0 :(得分:10)

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

  1. 安装“LLDB”:进入工具 - > Android-> SDK管理器,然后进入“SDK工具”标签,确保选中“LLDB”(接近结束时)通常的名单)
  2. 选择一个/“Debug”变体:在AS的左下角,单击“Build Variants”,默认的调试变体名为“Debug”
  3. 选择原生配置:运行按钮左侧(绿色三角形),默认本机配置称为“app-native”
  4. 设置断点
  5. 点击运行按钮右侧的小错误,在调试中启动您的应用
  6. 如果它不起作用,请检查本机配置是否已选择调试类型“混合”:在播放按钮的右侧,单击小三角形,选择“编辑配置”,然后选择您的“app-native”配置,进入“Debugger”选项卡并选择“Debug type:Hybrid”。

答案 1 :(得分:4)

Android Studio 1.3+支持本机调试。

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

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

         

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

  6.   
  7. 在C ++中设置断点

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

我已经能够使用Android Studio 1.3(稳定频道)在Lubuntu 14.04下调试本机代码。虽然其他人在Windows下已经取得了成功,但我haven't been able to debug原生在Windows 8.1中(我尝试过使用Android Studio 1.3,1.3.2和1.4预览版3)。

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

答案 2 :(得分:2)

我能够设置断点并逐步进入本机代码,但只有当以下所有条件都成立时才会这样:

  1. 生成的本机库.so文件保留了其调试符号
  2. 提供了来源(参见“图书馆属性”菜单)
  3. 我将运行/构建配置设置为使用本机调试器(如here所述)
  4. 现在在Android Studio 1.5中使用Gradle Experimental Plugin

    为我工作

答案 3 :(得分:1)

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

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

private void foo(int i){ byte[] a = new byte[1 * 1024 * 1024]; System.out.println(i+" "+a.length); foo(i+1); a[1] += a[0] + 1; } 偶尔会导致1或2。

  1. 安装将失败并显示消息&#34; INSTALL_FAILED_INVALID_APK&#34;
  2. 原生代码中的断点不起作用

答案 4 :(得分:0)

如果您在尝试所有方法后仍然无法击中本机断点,并且有可能在多个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')