[英]Debugging Android NDK C/C++ code in Eclipse - breakpoints are not hit
我下载了适用于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();
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:对不起,我的英语不是我的母语。 我写作有困难。
添加:同样在控制台显示调试期间:“警告:无法加载95个库的共享库符号,例如/ system / bin / linker。使用”info sharedlibrary“命令查看完整列表。是否需要”set solib- search-path“或”set sysroot“?警告:无法找到动态链接器断点函数.GDB将最终重试。同时,很可能GDB无法调试共享库初始化程序或在dlopen()之后解析挂起的断点。”
我使用的技巧是将一个usleep调用作为我的调试代码中的第一个本机行。
这使您的线程处于睡眠状态,并为调试器提供为您准备的机会。
#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
根据您的设备,您可能需要编写armeabi
或armeabi-v7a
。 你只需要做一次(我注意到手动运行ndk-gdb
正在这样做。手动执行该命令断点开始工作)
您可以使用ARM提供的DS-5 CE Android Debug工具作为eclipse的插件。 它工作得非常好,并为调试提供了一个非常好的和简单的UI。 根据我的个人经验,它比调试ndk应用程序的传统方式要好得多。
请参考以下链接,它将为您提供有关如何使用DS-5调试器的详细信息:
您的应用程序很早就执行了JNI函数,因此调试器还没有准备好。 不幸的是,gdb建立远程连接需要一段时间,请参阅http://visualgdb.com/documentation/appstartup
而不是对抗风车,为您的活动添加一个按钮,并在该按钮的Click()上调用相同的本机方法 - 捕获断点将更容易。
BTW,关于95个库的警告是完全正常的。 这些是您不想调试的系统库,并且没有源代码。
考虑添加:
android.os.Debug.waitForDebugger();
在您的本机通话之前,这会让您的应用等到调试器附加,可以帮助您避免睡眠/使用按钮。
我有这个问题,唯一对我有用的就是投入
Thread.sleep(2000);
在加载JNI库之前。 在调用System.loadLibrary
崩溃应用程序之前,这给了调试器足够的时间来附加。 帮我找到问题C ++代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.