2013-07-17 5 views
9

I Android-SDK-Paket für Linux und Android NDK. ADT wurde installiert, ich habe CDT installiert.Debugging Android NDK C/C++ Code in Eclipse - Stützpunkte sind nicht getroffen

habe ich ein Android-Projekt und fügte hinzu, native Unterstützung (JNI). Dann schrieb ich native Funktion in Java-Code, die in C++ - Code exportiert. In C++ Code habe ich diese Funktion definiert.

Java-Code:

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

private native String get_text_from_cpp(); 

C++ Code (h):

extern "C"{ 
    JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv *, jobject); 
} 

C++ Code (CPP):

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

-Code funktioniert ohne Fehler. Aber wenn ich den Haltepunkt in C++ Code setze, wird es nicht getroffen.

build-NKD NDK_DEBUG = 1 - enthalten sind

Ich folgte dieser Anleitung http://tools.android.com/recent/usingthendkplugin

Android.mk in jni/LOCAL_CFLAGS hat: = -g

Ich habe sehr viele Informationen lesen, aber ich Eclipse konnte nicht angepasst werden. Bitte, hilf irgendjemandem.

PS: Ich bin für mein Englisch leider ist nicht meine Muttersprache. Ich habe Schwierigkeiten beim Schreiben.

Anzahl: Auch während debug in der Konsole zeigt: „Warnung:. Konnte nicht gemeinsam genutzte Bibliothek Symbole für 95 Bibliotheken laden, die/system/bin/Linker Verwenden Sie die "info sharedlibrary" Befehl, um die vollständige Liste sehen . Benötigen Sie "set solib-search-path" oder "set sysroot"? Warnung: Dynamische Linker-Breakpoint-Funktion kann nicht gefunden werden. GDB wird möglicherweise erneut versuchen. Inzwischen ist es wahrscheinlich , dass GDB Debugging freigegebener Bibliotheksinitialisierungen nicht möglich ist oder auflösende Breakpoints nach dlopen() auflösen. "

+1

Vielleicht haben Sie Debug ausgeführt, der den Java-Debugger startet? Sie sollten mit der rechten Maustaste auf das Projekt und wählen Sie "Debug als" -> "android native Anwendung" –

+0

Ja, ich wählte "debug as" -> "android native Anwendung". In "Debugkonfigurationen" wurde eine neue Konfiguration hinzugefügt (in "Android Native Application") http://gyazo.com/567ae4fa0e8aa2363676789b7df780be – newman

+0

Vielleicht führt Ihre App die JNI-Funktion sehr früh aus, so dass der Debugger noch nicht fertig ist? Aus dem Code, den Sie gepostet haben, ist nicht ersichtlich, wo die native Methode aufgerufen wird.Ich würde eine Schaltfläche in Ihrer Aktivität vorschlagen, die die native Methode startet. Dann haben Sie die Möglichkeit, es mehrmals zu versuchen. –

Antwort

3

Ihre Anwendung führt die JNI-Funktion sehr früh, so dass der Debugger noch nicht bereit ist. Leider ist es eine Weile, GDB nimmt die Remote-Verbindung herzustellen, siehe http://visualgdb.com/documentation/appstartup

Statt die Windmühlen zu kämpfen, fügen Sie eine Schaltfläche, um Ihre Aktivität, und rufen Sie die gleiche native Methode onClick() dieser Taste - es wird einfacher, den Haltepunkt zu fangen.

BTW, die Warnung über 95 Bibliotheken ist vollkommen normal. Dies sind die Systembibliotheken, die Sie nicht debuggen möchten und für die Sie keine Quellen haben.

5

Sie können mit DS-5 CE Android Debug-Tool von ARM als Plugin in Eclipse zur Verfügung gestellt. Es funktioniert wirklich gut und bietet eine sehr gute und einfache Benutzeroberfläche zum Debuggen. Aus meiner persönlichen Erfahrung ist es viel besser als die traditionelle Art des Debuggens der ndk App.

Bitte lesen Sie den folgenden Link, die Sie mit den Details dafür, wie die DS-5-Debugger verwenden:

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

+0

Danke für den Link. Ich habe versucht, DS-5 zu verwenden, aber wenn ich eine neue Debug-Konfiguration erstelle, kann ich kein Gerät für die Verbindung aus der Dropdown-Liste Verbindungen auswählen, da ist nichts. – newman

+1

Noch eine Stimme für DS-5! – WindRider

12

Der Trick I verwenden, um einen usleep Ruf als erste native setzen Zeile in meinem Debug-Code.

Dies macht Ihren Thread schlafen und gibt dem Debugger die Möglichkeit, für Sie bereit zu sein.

#include <unistd.h> 

. 
. 
. 

#ifndef NDEBUG 
usleep(5000 * 1000); 
#endif 
1

prüfen, indem:

android.os.Debug.waitForDebugger();

vor Ihrer Mutter Anruf, diese App Warten macht, bis der Debugger legt, könnten Sie Schlaf/über eine Taste vermeiden helfen.

6

Nach einem viel kämpfen auf zu debuggen Eclipse- das ist mein Rezept:

die üblichen Schritte durchführen:

  • android.os.Debug.waitForDebugger(); hinzufügen, bevor Sie Ihre native Bibliothek zu laden. Dies könnte helfen.
  • hinzufügen APP_OPTIM := debug in Application.mk
  • Bauen mit ndk-build NDK_DEBUG=1

Dann, was ich anders gefunden:

  • Öffnen Sie eine Konsole und führen:

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

Abhängig von Ihrem Gerät müssen Sie möglicherweise armeabi oder armeabi-v7a schreiben. Sie müssen es nur einmal tun (ich bemerkte, dass ndk-gdb läuft manuell das tat Ausführen den Befehl manuell den einzelnen Stützpunkten zu arbeiten begann.)

  • schließlich zum Debuggen verwenden Sie das Menü „Ausführen -> Debug As -> Android native Anwendung“
+0

Zieht auch einige andere Bibliotheken (zumindest in der 4.9 Toolchain) – Colin

+1

Was ist das/system/bin/linker? Wo finde ich diesen Link? Ich bin ein Windows-Benutzer. –

0

hatte ich dieses Problem, und das einzige, was für mich gearbeitet wurde

Thread.sleep(2000); 

setzen, bevor die JNI-Bibliothek geladen wird. Dies gab dem Debugger genügend Zeit, sich anzuhängen, bevor der Aufruf an System.loadLibrary die App stürzte. Hat mir geholfen, den C++ - Problemcode zu finden.