2012-04-23 43 views
35

nếu tôi đang xác định chức năng như vậy trong tập tin javaLàm cách nào để nhận được thông báo "printf" được viết bằng ứng dụng NDK?

/** 
    * Adds two integers, returning their sum 
    */ 
    public native int add(int v1, int v2); 

vì vậy tôi cần phải viết mã trong tập tin c

JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add 
    (JNIEnv * env, jobject obj, jint value1, jint value2) { 

    printf("\n this is log messge \n"); 

     return (value1 + value2); 
} 

sau đó từ nơi printf này sẽ in nó nhắn? Trong logcate tôi không nhận được nó?

Làm cách nào để gỡ lỗi bất kỳ ứng dụng NDK nào bằng cách đặt thông điệp tường trình?

+1

'printf (3)' sẽ ghi vào bất kỳ đầu ra chuẩn _ nào - có thể có hoặc không tồn tại trong môi trường của bạn. Tốt hơn là tìm cơ chế ghi nhật ký được hỗ trợ. – sarnold

Trả lời

83

sử dụng __android_log_print() thay thế. Bạn phải bao gồm tiêu đề <android/log.h>

Ví dụ mẫu. __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "\n this is log messge \n");

Bạn cũng có thể sử dụng format specifier như printf -

__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "Need to print : %d %s",int_var, str_var); 

Hãy chắc chắn rằng bạn cũng có liên kết với thư viện khai thác gỗ, trong tập tin Android.mk của bạn:

LOCAL_LDLIBS := -llog 

Ohh .. quên. Đầu ra sẽ được hiển thị trong Logcat với thẻ LOG_TAG

Cách tiếp cận dễ dàng

Thêm các dòng sau vào tệp tiêu đề chung của bạn.

#include <android/log.h> 

#define LOG_TAG "your-log-tag" 

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) 
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) 
// If you want you can add other log definition for info, warning etc 

Bây giờ chỉ cần gọi LOGD("Hello world") or LOGE("Number = %d", any_int) như printf in c.

Đừng quên bao gồm tệp tiêu đề chung.

Tháo khai thác gỗ

Nếu bạn xác định LOGD(...) trống rỗng, tất cả các bản ghi sẽ được đi. Chỉ cần bình luận sau LOGD(...).

#define LOGD(...) // __android_log..... rest of the code

+0

Làm cách nào để xóa đăng nhập? – powder366

+1

@ powder366 trả lời cập nhật. kiểm tra phần xóa đăng nhập. – Shaiful

+5

Chỉ trong trường hợp ai đó (ví dụ: tôi) sử dụng Android Studio (mỏ hiện tại là 0.8.11), bạn đặt ldLibs "log" vào trong thẻ 'ndk'. Điều này giải quyết vấn đề không xác định đối với vấn đề '__android_log_print'. – Yang

12

Có hai lựa chọn:

1) thay thế printf với __android_log_print. Bạn có thể thực hiện việc này dễ dàng với xác định ở đầu mã:

#define printf(...) __android_log_print(ANDROID_LOG_DEBUG, "TAG", __VA_ARGS__); 

Tất nhiên điều này sẽ yêu cầu thay đổi tất cả mã nguồn có printf.

2) chuyển hướng stdout và stderr để logcat Android (không chắc chắn nếu điều này sẽ làm việc trên thiết bị không bắt nguồn từ): http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd

+0

khi tôi sử dụng tùy chọn 2 sau đó sau khi áp dụng 3 lệnh đó khi tôi chạy trình mô phỏng ứng dụng của mình chỉ cần gác máy hiển thị android bootanimation .. –

5

không cần phải nhổ tận gốc thiết bị, acroding để http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd, bên dưới có thể làm việc prefectly.

$ adb shell 

$ su 

$ stop 

$ setprop log.redirect-stdio true 

$ start 

hoàn tất!

+2

lệnh su sẽ không hoạt động nếu không có quyền truy cập root .. !! –

+0

anyway +1 để chỉ ra phương pháp setprop cho việc này. –

+2

Phương pháp này chỉ hoạt động trên các phiên bản Android chạy dalvik (4.4 trở lên), các phiên bản ART (5.0 trở lên) không hỗ trợ log.redirect-stdio. Nguồn: https://code.google.com/p/android/issues/detail?id=165602 – Deemoe

Các vấn đề liên quan