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)
挣扎了之后很多对调试的Eclipse,这是我的食谱:
做通常的步骤:
android.os.Debug.waitForDebugger();在加载本机库之前添加.这可能有所帮助.APP_OPTIM := debug在Application.mkndk-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
不要与风车对抗,而是向您的活动添加一个按钮,并调用该按钮的相同本机方法 onClick() - 捕获断点会更容易。
顺便说一句,关于 95 个库的警告是完全正常的。这些是您不想调试的系统库,并且没有源代码。
| 归档时间: |
|
| 查看次数: |
21968 次 |
| 最近记录: |