Tidak dapat men-debug kode asli di bawah Eclipse

Lingkungan: NDK + Eclipse Juno + ADT + CDT terbaru. Semuanya mutakhir.

Saat saya mencoba men-debug aplikasi Android saya secara asli, saya mendapatkan kesalahan berikut:

 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().

Untuk memastikan ini bukan aplikasi spesifik saya, saya membuat aplikasi tiruan sederhana. Inilah langkah-langkah yang saya ambil.

  1. Dari Eclipse, buat proyek aplikasi Android baru (dengan min-sdk 16 dan target-sdk 21)
  2. Menambahkan kelas:
package com.test.mytest1;

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

Perhatikan bahwa saya telah menambahkan baris untuk menunggu debugger diinisialisasi.

  1. Disebut MyNative.init() dari metode onCreate() MainActivity.

  2. Dari preferensi, perbaiki NDK agar mengarah ke direktori C:\adt\ndk.

  3. Dari menu proyek, pilih Alat Android-->Tambahkan Dukungan Asli.

  4. Dari Properties->C++ Build, setel perintah build ke "ndk-build NDK_DEBUG=1"

  5. Berikut kode di mytest1.cpp:

static int x = 0;

JNIEXPORT void JNICALL Java_com_test_mytest1_MyNative_init(JNIEnv *, jclass)
{
    x++;
}
  1. Menambahkan Application.mk di direktori jni:
APP_ABI := armeabi-v7a 
APP_PLATFORM := android-16

Sekarang, ketika saya mencoba menjalankan aplikasi sebagai aplikasi asli, gagal dengan pesan yang disebutkan di atas.

Ketika saya melihat file apk, lib/armeabi-v7a memang berisi file gdbserver serta libmytest1.so.

Aplikasi ini berfungsi. Jika saya menambahkan pernyataan log() dalam metode asli saya, pernyataan itu akan ditampilkan di LogCat.

Saya bingung dan lelah. Hal sederhana seperti itu seharusnya berhasil. Ingin tahu apakah Anda dapat membagikan apa yang Anda lakukan secara berbeda agar berhasil. Salam.


person Peter    schedule 11.09.2014    source sumber
comment
Aneh (bagi saya) untuk menempatkan android.os.Debug.waitForDebugger(); dalam penginisialisasi statis. Bila diperlukan, biasanya saya letakkan di onCreate. Tapi saya tidak yakin itu penting untuk masalah Anda.   -  person jww    schedule 13.09.2014
comment
Terkait: Men-debug aplikasi asli Android NDK. Tapi saya tidak yakin apakah metode ini berlaku untuk objek bersama.   -  person jww    schedule 13.09.2014


Jawaban (1)


  1. android.os.Debug.waitForDebugger() adalah untuk debugging JAVA.
  2. Untuk men-debug kode asli, tambahkan sleep(detik) sebelum breakpoint pertama Anda, sehingga gdb harus menghubungkan gdbserver

    JNIEXPORT batal JNICALL Java_com_test_mytest1_MyNative_init(JNIEnv *, jclass) { tidur(10); x++; }

person user3004288    schedule 19.12.2014