ไม่สามารถดีบักโค้ดเนทิฟภายใต้ Eclipse

สภาพแวดล้อม: 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().

เพื่อให้แน่ใจว่าไม่ใช่แอปพลิเคชันเฉพาะของฉัน ฉันจึงสร้างแอปพลิเคชันจำลองแบบง่ายๆ นี่คือขั้นตอนที่ฉันทำ

  1. จาก Eclipse สร้างโครงการแอปพลิเคชัน Android ใหม่ (ด้วย min-sdk 16 และ target-sdk 21)
  2. เพิ่มคลาส:
package com.test.mytest1;

public class MyNative {
    static {
        android.os.Debug.waitForDebugger();
        System.loadLibrary("mytest1");
    }
    native public static void init();
}

โปรดทราบว่าฉันได้เพิ่มบรรทัดเพื่อรอให้ดีบักเกอร์เริ่มต้น

  1. เรียกว่า MyNative.init() จากเมธอด onCreate() ของ MainActivity

  2. จากการตั้งค่า แก้ไข NDK ให้ชี้ไปที่ไดเร็กทอรี C:\adt\ndk

  3. จากเมนูโปรเจ็กต์ ให้เลือกเครื่องมือ Android-->เพิ่มการสนับสนุนแบบเนทีฟ

  4. จาก Properties->C++ Build ให้ตั้งค่าคำสั่ง build เป็น "ndk-build NDK_DEBUG=1"

  5. นี่คือโค้ดใน mytest1.cpp:

static int x = 0;

JNIEXPORT void JNICALL Java_com_test_mytest1_MyNative_init(JNIEnv *, jclass)
{
    x++;
}
  1. เพิ่ม Application.mk ในไดเร็กทอรี jni:
APP_ABI := armeabi-v7a 
APP_PLATFORM := android-16

ตอนนี้ เมื่อฉันพยายามเรียกใช้แอปแบบเนทิฟแอปพลิเคชัน มันล้มเหลวโดยมีข้อความที่กล่าวมาข้างต้น

เมื่อฉันดูไฟล์ APK lib/armeabi-v7a มีไฟล์ gdbserver และ libmytest1.so

แอปใช้งานได้ หากฉันเพิ่มคำสั่ง log() ในวิธีดั้งเดิมของฉัน ข้อความนั้นจะแสดงใน LogCat

ฉันสับสนและเหนื่อย สิ่งง่ายๆ เช่น สิ่งควรจะได้ผล สงสัยว่าคุณสามารถแบ่งปันสิ่งที่คุณทำแตกต่างออกไปเพื่อให้มันได้ผลได้ไหม ความนับถือ.


person Peter    schedule 11.09.2014    source แหล่งที่มา
comment
มันแปลก (สำหรับฉัน) ที่จะวาง android.os.Debug.waitForDebugger(); ในเครื่องมือเริ่มต้นแบบคงที่ เมื่อจำเป็น ฉันมักจะวางไว้ใน onCreate ฉันไม่แน่ใจว่ามันสำคัญสำหรับปัญหาของคุณหรือเปล่า   -  person jww    schedule 13.09.2014
comment
ที่เกี่ยวข้อง: การดีบักแอปเนทิฟ NDK ของ Android แต่ฉันไม่แน่ใจว่าวิธีการต่างๆ ใช้กับวัตถุที่แชร์หรือไม่   -  person jww    schedule 13.09.2014


คำตอบ (1)


  1. android.os.Debug.waitForDebugger() มีไว้สำหรับการดีบัก JAVA
  2. หากต้องการดีบักโค้ดเนทีฟให้เพิ่ม sleep(seconds) ก่อนเบรกพอยต์แรกของคุณ นั่นเป็นวิธีที่ gdb ต้องเชื่อมต่อ gdbserver

    JNIEXPORT เป็นโมฆะ JNICALL Java_com_test_mytest1_MyNative_init (JNIEnv *, jclass) { สลีป (10); เอ็กซ์++; }

person user3004288    schedule 19.12.2014