我正在使用NDK开发Android应用程序。我有两个项目。一个是我的本地库,它使用NDK并生成.so文件。
我正在使用Android Studio,但是使用ndk-build禁用自动构建和启用构建。我使用的是Windows 7.
现在生成.so文件后,我复制了我的主应用程序项目中的那些,它也使用ndk-build编译JNI函数,我在其中调用我的库的函数。我希望到目前为止我很干净。如果没有,那么我会根据要求提供更多细节。
现在我正在使用Android Studio在设备中运行我的应用程序,我可以在java代码中设置断点并调试该代码,但我无法调试JNI调用以及我在单独项目中的本机代码。我需要调试我的库代码。有没有办法实现这个目标?
我见过VisualGDB,但付了钱。所以让我知道是否有任何替代方案可以完全满足我的调试要求。我已经搜索了很多,但没有得到任何具体的解决方案。
我可以在Android Studio中看到附加到android进程的选项,我可以看到我正在运行的设备,但我不知道如何使用它,所以我可以通过本机库代码进行调试(这是在没有任何活动的单独项目中)。
如果需要更多细节,请告诉我
答案 0 :(得分:10)
在Android Studio 2.0预览中,这个过程有点不同(我认为更容易):
如果它不起作用,请检查本机配置是否已选择调试类型“混合”:在播放按钮的右侧,单击小三角形,选择“编辑配置”,然后选择您的“app-native”配置,进入“Debugger”选项卡并选择“Debug type:Hybrid”。
答案 1 :(得分:4)
Android Studio 1.3+支持本机调试。
要进行设置,请按以下步骤操作:
- 修改gradle-wrapper.properties,local.properties和build.gradle文件,如this guide
所示- 同步gradle
创建并选择新的构建配置:
点击“运行”按钮旁边的下拉菜单) - >编辑配置,单击加号,选择Android Native,在右侧填写选项(我在本机调试器选项卡中使用LLDB),您应该设置。
在C ++中设置断点
- 点击调试按钮并耐心等待(有时调试器需要一段时间)
醇>
我已经能够使用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)
我能够设置断点并逐步进入本机代码,但只有当以下所有条件都成立时才会这样:
现在在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。
答案 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')