在Eclipse中debuggingAndroid NDK C / C ++代码 – 断点没有命中

我下载了适用于Linux和Android NDK的Android SDK Bundle。 安装了ADT,我安装了CDT。

我创build了一个Android项目并添加了原生支持(jni)。 然后我用java代码编写了原生函数,用c ++代码导出。 在c ++代码中,我定义了这个函数。

Java的代码:

static { System.loadLibrary("test"); } private native String get_text_from_cpp(); 

c ++代码(h):

 extern "C"{ JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv *, jobject); } 

c ++代码(cpp):

 JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv * env, jobject){ return env->NewStringUTF( "hello from C++" ); } 

代码工作没有错误。 但是当我在c ++代码中设置断点时,它不会被触发。

build-nkd NDK_DEBUG = 1 – 都包含在内

我按照这个说明http://tools.android.com/recent/usingthendkplugin

jni中的Android.mk具有LOCAL_CFLAGS:= -g

我已经阅读了很多信息,但是我不能定制Eclipse。 请帮助任何人

PS:我很抱歉我的英文不是我的母语。 我有写作的困难。

添加:在控制台的debugging过程中也显示:“警告:无法为95个库加载共享库符号,例如/ system / bin / linker。使用”info sharedlibrary“命令来查看完整的列表。是否需要”set solib- search-path“或者”set sysroot“?警告:无法finddynamic链接器断点函数,GDB会重试,同时很可能GDB无法在dlopen()之后debugging共享库初始化程序或parsing挂起的断点。

Solutions Collecting From Web of "在Eclipse中debuggingAndroid NDK C / C ++代码 – 断点没有命中"

我使用的技巧是在我的debugging代码中将第一个本地行作为睡眠呼叫。

这使得你的线程睡眠,并给debugging器一个机会为你做好准备。

 #include <unistd.h> . . . #ifndef NDEBUG usleep(5000 * 1000); #endif 

Eclipse上苦苦挣扎之后,这是我的秘诀:

通常的步骤:

  • 添加android.os.Debug.waitForDebugger(); 加载你的本地库之前。 这可能有帮助。
  • Application.mk添加APP_OPTIM := debug
  • ndk-build NDK_DEBUG=1

那么,我发现有什么不同:

  • 打开一个控制台并运行:

adb pull /system/bin/linker <your_project_base_dir>/obj/local/armeabi/linker

根据你的设备,你可能不得不写armeabiarmeabi-v7a 。 你只需要做一次(我注意到手动运行ndk-gdb就是这样做的。手动执行这个命令,断点开始工作)

  • 最后,要debugging使用菜单“运行 – >debugging为 – > Android本机应用程序”

您可以使用ARM提供的DS-5 CE Androiddebugging工具作为eclipse的插件。 它工作得非常好,并提供了一个非常好的和简单的用户界面进行debugging 从我个人的经验来看,它比debuggingndk应用程序的传统方法要好得多。

请参考以下链接,其中将提供如何使用DS-5debugging器的详细信息:

https://developer.arm.com/products/software-development-tools/ds-5-development-studio/resources/tutorials/android-native-app-debug-tutorial

你的应用程序很早就执行了JNI函数,所以debugging器还没有准备好。 不幸的是,gdbbuild立远程连接需要一段时间,请参阅http://visualgdb.com/documentation/appstartup

添加一个button到您的活动,并调用相同的本地方法onClick()该button – 这将是更容易赶上的断点。

顺便说一句,关于95个图书馆的警告是完全正常的。 这些是您不想debugging的系统库,并且没有源代码。

考虑join:

android.os.Debug.waitForDebugger();

在您的本地调用之前,这会让您的应用程序等待直到debugging器附加,可以帮助您避免睡眠/使用button。

我有这个问题,唯一对我有用的是放

 Thread.sleep(2000); 

在JNI库加载之前。 这给debugging器足够的时间来附加之前调用System.loadLibrary崩溃的应用程序。 帮助我find问题C ++代码。