在Eclipse中调试Android NDK C/C++代码 - 没有命中断点

new*_*man 9 eclipse debugging java-native-interface android android-ndk

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

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

Java的代码:

static {
    System.loadLibrary("test");
}

private native String get_text_from_cpp();
Run Code Online (Sandbox Code Playgroud)

c ++代码(h):

extern "C"{
   JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv *, jobject);
}
Run Code Online (Sandbox Code Playgroud)

c ++代码(cpp):

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

代码无误地运行.但是当我在c ++代码中设置断点时,它没有被击中.

build-nkd NDK_DEBUG = 1 - 包括在内

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

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

我已经阅读了很多信息,但我无法定制Eclipse.请帮助任何人.

PS:对不起,我的英语不是我的母语.我写作有困难.

添加:同样在控制台显示调试期间:"警告:无法加载95个库的共享库符号,例如/ system/bin/linker.使用"info sharedlibrary"命令查看完整列表.是否需要"set solib- search-path"或"set sysroot"?警告:无法找到动态链接器断点函数.GDB将最终重试.同时,很可能GDB无法调试共享库初始化程序或在dlopen()之后解析挂起的断点."

小智 12

我使用的技巧是将一个usleep调用作为我的调试代码中的第一个本机行.

这使您的线程处于睡眠状态,并为调试器提供为您准备的机会.

#include <unistd.h>

.
.
.

#ifndef NDEBUG
usleep(5000 * 1000);
#endif
Run Code Online (Sandbox Code Playgroud)


Pag*_*ian 6

挣扎了之后很多对调试的Eclipse,这是我的食谱:

做通常的步骤:

  • android.os.Debug.waitForDebugger();在加载本机库之前添加.这可能有所帮助.
  • 添加APP_OPTIM := debugApplication.mk
  • 用.构建 ndk-build NDK_DEBUG=1

然后,我发现了不同的东西:

  • 打开控制台并运行:

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

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

  • 最后,要调试使用菜单"运行 - >调试为 - > Android本机应用程序"


Zax*_*Zax 5

您可以使用ARM提供的DS-5 CE Android Debug工具作为eclipse的插件.它工作得非常好,并为调试提供了一个非常好的和简单的UI.根据我的个人经验,它比调试ndk应用程序的传统方式要好得多.

请参考以下链接,它将为您提供有关如何使用DS-5调试器的详细信息:

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


Ale*_*ohn 3

您的应用程序很早就执行了 JNI 函数,因此调试器尚未准备好。不幸的是,gdb 建立远程连接需要一段时间,请参见 http://visualgdb.com/documentation/appstartup

不要与风车对抗,而是向您的活动添加一个按钮,并调用该按钮的相同本机方法 onClick() - 捕获断点会更容易。

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