9

我下载了适用于 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() 之后解决挂起的断点。

4

6 回答 6

12

我使用的技巧是将 usleep 调用作为调试代码中的第一行。

这会让你的线程休眠,让调试器有机会为你做好准备。

#include <unistd.h>

.
.
.

#ifndef NDEBUG
usleep(5000 * 1000);
#endif
于 2013-07-31T03:45:43.540 回答
6

在Eclipse上进行了很多调试之后,这是我的秘诀:

执行通常的步骤:

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

然后,我发现不同的是:

  • 打开控制台并运行:

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

根据您的设备,您可能需要编写armeabiarmeabi-v7a. 您只需要执行一次(我注意到ndk-gdb手动运行正在执行此操作。手动执行该命令,断点开始工作)

  • 最后,使用菜单“运行 -> 调试为 -> Android Native Application”进行调试
于 2014-05-30T22:05:55.553 回答
5

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

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

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

于 2013-07-18T04:51:46.953 回答
3

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

与其与风车搏斗,不如在您的活动中添加一个按钮,然后调用该按钮的相同本机方法 onClick() - 捕获断点会更容易。

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

于 2013-07-18T04:06:59.277 回答
1

考虑添加:

android.os.Debug.waitForDebugger();

在您的本机调用之前,这会使您的应用程序等到调试器附加,可以帮助您避免睡眠/使用按钮。

于 2014-03-14T18:22:35.737 回答
0

我遇到了这个问题,唯一对我有用的就是把

Thread.sleep(2000);

在加载 JNI 库之前。这为调试器在调用System.loadLibrary崩溃应用程序之前附加了足够的时间。帮助我找到了问题 C++ 代码。

于 2015-06-24T20:51:50.290 回答