【发布时间】:2014-09-11 06:43:29
【问题描述】:
环境:最新的 NDK + Eclipse Juno + ADT + CDT。一切都是最新的。
当我尝试在本地调试我的 Android 应用程序时,我收到以下错误:
warning: Unable to find dynamic linker breakpoint function.
GDB will retry eventurally. Meanwhile, it is likely
that GDB is unable to debug shared library initializers
or resolve pending breakpoints after dlopen().
为了确保它不是我的特定应用程序,我创建了一个简单的虚拟应用程序。以下是我采取的步骤。
- 在 Eclipse 中,创建一个新的 Android 应用程序项目(使用 min-sdk 16 和 target-sdk 21)
- 添加了一个类:
package com.test.mytest1;
public class MyNative {
static {
android.os.Debug.waitForDebugger();
System.loadLibrary("mytest1");
}
native public static void init();
}
请注意,我添加了一行等待调试器初始化。
从 MainActivity 的 onCreate() 方法调用 MyNative.init()。
从首选项中,将 NDK 固定为指向 C:\adt\ndk 目录。
从项目菜单中,选择 Android Tools-->Add Native Support。
从 Properties->C++ Build,将构建命令设置为“ndk-build NDK_DEBUG=1”
这是mytest1.cpp中的代码:
static int x = 0;
JNIEXPORT void JNICALL Java_com_test_mytest1_MyNative_init(JNIEnv *, jclass)
{
x++;
}
- 在 jni 目录中添加了 Application.mk:
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16
现在,当我尝试将应用程序作为本机应用程序运行时,它会失败并显示上述消息。
当我查看 apk 文件时,lib/armeabi-v7a 确实包含 gdbserver 以及 libmytest1.so 文件。
该应用程序确实有效。如果我在本机方法中添加 log() 语句,它会显示在 LogCat 中。
我感到困惑和疲倦。一个简单的事情应该只是工作。想知道您是否可以分享您所做的不同工作以使其发挥作用。问候。
【问题讨论】:
-
将
android.os.Debug.waitForDebugger();放在静态初始化器中(对我来说)很奇怪。需要的时候,我一般会放在onCreate。不过,我不确定这对您的问题是否重要。 -
相关:Debugging Android NDK native apps。但我不确定这些方法是否适用于共享对象。
标签: android eclipse android-ndk