我在获取本机调试支持以在 Windows for Android 下为我的 Eclipse 项目工作时遇到问题。不幸的是,经过超过 1 天的研究,谷歌并没有提供帮助。
我几乎是 eclipse 的初学者,所以解决方案可能很简单,因为我猜我也会做一些非标准的事情。
我的 android 项目已经在我的设备上运行良好(Acer Iconia A500 Android 3.2.1、HTC Incredible S Android 4.0.4 等)。
我使用 ADT 插件向导创建了项目,然后使用 ADT 添加的项目上下文菜单条目添加了本机支持。
然后我添加了我已经拥有的 java 文件(以前我使用 CMake 和 Android 独立工具链进行编译,尽管我从未尝试过这种方式进行远程调试)。我为那个“com.xy”创建了一个新包,我把它们放到了那里(我不想透露真正的包名,因为该项目将成为商业产品的一部分)。
然后我通过将它们拖到 jni 文件夹中来添加我的源。源代码不在 jni 文件夹内,而是链接到项目下方的位置“../../”(它是跨平台应用程序的一部分,因此我可以在不同的工具链中重用源文件)。
我还通过以下方式调整 Android.mk 来链接产品随附的 4 个静态库:
LOCAL_PATH := $(call my-dir)
MY_PATH := $(LOCAL_PATH)
LOCAL_PATH := $(MY_SDK)/lib/Android/armeabi-v7aD
include $(CLEAR_VARS)
LOCAL_MODULE := A
LOCAL_SRC_FILES := libA.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := B
LOCAL_SRC_FILES := libB.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := C
LOCAL_SRC_FILES := libC.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := D
LOCAL_SRC_FILES := libD.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES += $(my_SDK)/include/
LOCAL_PATH := $(MY_PATH)/../../..
LOCAL_CFLAGS += -Wno-format -DANDROID -fno-rtti -fno-exceptions #And many other flags If they are important I will post them later, too
LOCAL_CPPFLAGS += -fno-rtti -fno-exceptions
LOCAL_MODULE := MY_PROJECT
LOCAL_SRC_FILES := Android/Main.cpp # Some other sources..
LOCAL_LDLIBS := -lstdc++ -lEGL -lGLESv2 -llog -Wl,--allow-multiple-definition -Wl,--no-undefined
LOCAL_STATIC_LIBRARIES := A B C D
include $(BUILD_SHARED_LIBRARY)
我也有一个Application.mk:
APP_ABI := armeabi-v7a
APP_PLATFORM := android-9
APP_STL := stlport_static
APP_CFLAGS += -fno-rtti -fno-exceptions
然后我在 Debug Configurations 下添加了一个新的“Android Native Application”,启动默认 Activity 并使用
调试器“${NdkGdb}”
命令文件“${NdkProject}\libs\${NdkCompatAbi}\gdb.setup”
共享库(自动添加)${NdkProject}/obj/local/$NdkCompatAbi}/
其余的也会自动添加,我认为应该以这种方式工作。
我认为奇怪的一件事是我得到了控制台输出
[2013-03-08 10:50:36 - 无法启动 cygpath。Cygwin 在路径上吗?] java.io.IOException: 无法运行程序 "cygpath": CreateProcess error=2, 系统找不到指定的文件
但是我可以通过这种方式很好地构建项目,后来我没有收到任何尝试附加 gdb 的警告(我使用的是 Msys,我也安装了 cygwin,所以我不知道为什么 Eclipse 在这里抱怨)。
当我启动应用程序时,它会在设备上启动,然后我得到以下控制台输出([Android Native Application] gdb):
(no debugging symbols found)
Error while mapping shared library sections:
/system/bin/linker: No such file or directory.
Error while mapping shared library sections:
libstdc++.so: No such file or directory.
... And alot more of that type
(no debugging symbols found)
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
warning: shared library handler failed to enable breakpoint
No line 219 in file "jni/../../../MySourceFile.cpp".
我肯定用 NDK_DEBUG=1 构建,我的静态 .a 库是用 -g AndroidManifest.xml 构建的,有一个条目 android:debuggable="true"。
当我在 Eclipse 项目目录(使用 Msys)中运行“sh /ndk-gdb --verbose”时,我得到以下输出:
Android NDK 安装路径:/c/SDK/android-ndk-r7 使用默认 adb 命令:/c/SDK/android-sdks/platform-tools/adb.exe 找到 ADB 版本:Android Debug Bridge version 1.0.31 Using final ADB命令:'/c/SDK/android-sdks/platform-tools/adb.exe' 使用自动检测的项目路径:. 找到包名称:com.xy ABI 应用程序目标:armeabi-v7a 设备 API 级别:13 设备 CPU ABI:armeabi-v7a armeabi 兼容设备 ABI:armeabi-v7a 找到可调试标志:true 错误:目标上安装了不可调试的应用程序设备。请重新安装可调试版本!
我真的很想为这个项目提供原生调试支持。所以我真的很感激任何帮助。
我必须使用cygwin是真的吗?在尝试附加调试器时,我没有收到任何合理的错误消息。