我正在将一个复杂的 C 应用程序移植到 Android,作为一个 SO 库,包裹着薄薄的 java 层。 经过几个小时的麻烦,我在 Android 下编译了代码,但是当然,应用程序崩溃了:(
环顾四周后,我了解到在 Android 下调试 C 应用程序的唯一方法是通过 gdb。由于我对 gdb 的经验不多,所以有人可以分享一些见解吗?
谁有 Windows 下 gdb 的教程:)?
谢谢
最佳答案
对于较新版本的 NDK(我使用的是 r7c),您可以通过以下方式构建调试版本
- 添加
android:debuggable="true"
标记为<Application>
在AndroidManifest.xml
中标记 - 调用
ndk-build
与NDK_DEBUG=1
(如果使用 unix shell 运行 ndk-build,则不需要 NDK_DEBUG 标志)
在 Windows 上,事情变得有点棘手,因为要使用 ndk-gdb
,从 NDK r7c 开始,您仍然需要 bash(或 cygwin),但是 ndk-build
如果您使用任何预构建的静态库,在 cygwin bash 中运行将遇到权限问题
我在windows机器上的解决方案是
- 添加
android:debuggable="true"
标记为<application
在AndroidManifest.xml
中标记(同上) - 在 cmd(Windows 命令提示符)中:调用
ndk-build
与NDK_DEBUG=1
- 在 cygwin bash 中:运行
ndk-gdb
为了快速初探原生so库,创建一个简单的activity一键触发库入口函数和loadLibrary
在这样的 Activity 中:
class MyActivity extends Activity {
static {
System.loadLibrary("mylibrary");
}
/* other functions like onCreate, etc... */
public native void libfunc();
public void onClick(View v){
libfunc();
}
}
所以当gdb
启动时,有问题的库实际上已加载,但您仍然有时间在程序崩溃之前设置断点等;当您完成调试器的设置后,在 (gdb)
提示符,输入 continue
(或只是“c
”),然后点击按钮启动崩溃程序并愉快地调试...
关于android - windows下调试Android NDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238408/