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

如何在NDK本机代码中获取断点并在Android Studio中调试本机代码?,android,android-studio,android-ndk,Android,Android Studio,Android Ndk,我正在使用NDK开发android应用程序。我有两个项目。一个是我的本地库,它使用NDK并生成.so文件 我正在使用Android Studio,但禁用了自动构建,并使用ndk构建启用了构建。我正在使用Windows7 现在,在生成.so文件之后,我复制了我的主应用程序项目中的文件,该项目也使用ndk build编译JNI函数,我在其中调用库的函数。我希望到现在为止我还是清白的。如果没有,我会根据要求提供更多细节 现在,我正在使用Android Studio在设备中运行我的应用程序,我可以在ja

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

我正在使用Android Studio,但禁用了自动构建,并使用ndk构建启用了构建。我正在使用Windows7

现在,在生成.so文件之后,我复制了我的主应用程序项目中的文件,该项目也使用ndk build编译JNI函数,我在其中调用库的函数。我希望到现在为止我还是清白的。如果没有,我会根据要求提供更多细节

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

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

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


如果需要更多详细信息,请告诉我

Android Studio 1.3+支持本机调试

要进行设置,请执行以下步骤:

  • 修改gradle-wrapper.properties、local.properties和build.gradle文件,如中所示
  • 同步梯度
  • 创建并选择新生成配置:

    单击run按钮旁边的下拉菜单)->编辑配置,单击加号,选择Android Native,填写右侧的选项(我在Native debugger选项卡中使用了LLDB),然后应该设置

  • 在C语言中设置断点++

  • 点击调试按钮并保持耐心(有时调试器需要一段时间)
  • 我已经能够用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测试版刚刚发布。我对它进行了测试,并能够在Windows 8.1上进行本机调试。

    在Android Studio 2.0预览版中,该过程有点不同(我认为更简单):

  • 安装“LLDB”:进入工具->Android->SDK管理器,然后进入“SDK工具”选项卡,确保选中“LLDB”(通常位于列表末尾)
  • 选择“调试”变量:在AS的左下角,单击“构建变量”,默认调试变量称为“调试”
  • 选择本机配置:运行按钮左侧(绿色三角形),默认本机配置称为“应用程序本机”
  • 设置断点
  • 点击运行按钮右侧的小错误,在调试中启动应用程序

  • 如果不起作用,请检查您的本机配置是否已选择调试类型“混合”:在播放按钮的右侧,单击小三角形,选择“编辑配置”,选择“应用程序本机”配置,进入“调试器”选项卡并选择“调试类型:混合”.

    我能够设置断点并单步执行本机代码,但只有在以下所有条件均为真时:

  • 生成的本机库.so文件保留了它们的调试符号
  • 提供了源(请参见“库属性”菜单)
  • 我将运行/生成配置设置为使用本机调试器(如上所述)

  • 它现在在Android Studio 1.5中对我有效,如果本机代码中的断点不起作用,则使用另一个检查点:

    • 删除android:extractNativeLibs=“false”行或在AndroidManifest.xml中将其设置为true
    extractNativeLibs=“false”
    偶尔会导致1或2

  • 安装将失败,并显示消息“安装失败\u无效\u APK”
  • 本机代码中的断点不起作用

  • 如果在您尝试了所有操作之后,您的本机断点仍然无法命中,并且您的本机库可能已经在多个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')
    

    抱歉,在android studio中不可能进行本机调试。顺便说一句,如果你给你的问题加上一些格式,使它不那么“密集”,更多的人会阅读它。@JonasCz实际上,现在是这样了,请看Sistr的答案below@Premal,我看到没有公认的答案,在调试a时,有任何建议的解决方案有效吗。因此,从第二个项目中的一个项目来看?对我来说,一切似乎都很好,没有错误,调试器正在控制台中附加。但我的断点根本没有被击中。我的断点位于Activity onCreate中调用的一段代码中。结果发现Android Studio 1.3中存在一个bug,在应用程序启动时断点不会被命中。在金丝雀频道将我的IDE升级到1.4测试版,效果很好。顺便说一句,如果您尝试使用graddle 2.9及以上版本,在编译时可能会出现空指针异常。如果是这种情况,只需进入[preferences]->[Build,Execution,Deployment]->[Instant Run]并检查Instant Run是否被取消激活。Graddle 2.9与instant run存在问题。哈哈哈哈!!!很抱歉信不信由你,我错过了第一步!现在它可以工作了(Studio 2.0 Beta 4,Gradle 2.10,不是实验版)。谢谢这么多!这应该是公认的答案!很高兴看到它有所帮助:)有一天我的调试停止了随机工作。解决方案是将调试类型从“Auto”设置为“Dual”(Android Studio 3.0.2)。@CJxD您是一个救生员。非常感谢。