Any simple or easy way to log in Android NDK code?
up vote
59
down vote
favorite
I'm looking for a way to easily debug C code in an Android NDK application using Eclipse. I've read ways to debug the app using gdb or something similar but what I want is a way to push messages to Eclipse somehow.
I'm looking for a solution that's as simple as using a print function in C and seeing it in the DDMS Log or anything similar. Does anyone have any experience doing this?
android c eclipse jni android-ndk
add a comment |
up vote
59
down vote
favorite
I'm looking for a way to easily debug C code in an Android NDK application using Eclipse. I've read ways to debug the app using gdb or something similar but what I want is a way to push messages to Eclipse somehow.
I'm looking for a solution that's as simple as using a print function in C and seeing it in the DDMS Log or anything similar. Does anyone have any experience doing this?
android c eclipse jni android-ndk
add a comment |
up vote
59
down vote
favorite
up vote
59
down vote
favorite
I'm looking for a way to easily debug C code in an Android NDK application using Eclipse. I've read ways to debug the app using gdb or something similar but what I want is a way to push messages to Eclipse somehow.
I'm looking for a solution that's as simple as using a print function in C and seeing it in the DDMS Log or anything similar. Does anyone have any experience doing this?
android c eclipse jni android-ndk
I'm looking for a way to easily debug C code in an Android NDK application using Eclipse. I've read ways to debug the app using gdb or something similar but what I want is a way to push messages to Eclipse somehow.
I'm looking for a solution that's as simple as using a print function in C and seeing it in the DDMS Log or anything similar. Does anyone have any experience doing this?
android c eclipse jni android-ndk
android c eclipse jni android-ndk
edited Nov 10 at 20:34
Onik
10.9k103760
10.9k103760
asked Jan 7 '11 at 19:11
wajiw
8,895174671
8,895174671
add a comment |
add a comment |
6 Answers
6
active
oldest
votes
up vote
112
down vote
accepted
You can use the Android logging facilities:
#include <android/log.h>
#define APPNAME "MyApp"
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
Make sure you also link against the logging library, in your Android.mk file:
LOCAL_LDLIBS := -llog
1
If using the new Gradle NDK integration in Android Studio (Gradle experimental), you need to add this line ldLibs.addAll(['android','log']) to your android.ndk options .
– Sadegh Ghanbari
Nov 1 '16 at 16:21
add a comment |
up vote
12
down vote
The easiest way is probably to redirect printf() statements to the system log (based on the "Viewing stdout and stderr" section of the official ADB reference manual.
Type these 3 commands on a command line:
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Then you can view the output of your "printf()" statements by looking at the "LogCat" window of Eclipse Debugger, or by typing this on a command line:
adb logcat
Just be aware that since the data is buffered before transferring from the emulator or device, you should definitely flush the stdout buffer, eg:
printf("Hello, I am %d years old!n", 30);
fflush(stdout);
You should then see a log message starting with "I/stdout:"
4
Note that this solution breaks JUnit tests. See: stackoverflow.com/questions/3462850/…
– Sebastian Krysmanski
May 10 '12 at 7:28
fflush
has to be called after every printf statement?
– Igor Ganapolsky
Apr 12 '16 at 17:56
add a comment |
up vote
2
down vote
An alternative solution (using a debugger) is explained here:
How can I effectively debug C code that's wrapped with JNI in Eclipse? (Android Dev)
add a comment |
up vote
2
down vote
ADT 20 includes an NDK plugin that provides support for building and debugging NDK projects in Eclipse. This document describes how to install and use the NDK plugin. Instructions are pretty straightforward and consist of only a few steps.
This is the simplest solution I found and it worked for me.
Note: If you are using ADT bundle you only need to install C development tools with install new software (see the screenshot) and you can go to "Using the NDK plugin" part immediately.
Edit: It seems there is an issue with CDT in eclipse juno http://code.google.com/p/android/issues/detail?id=33788 causing eclipse's debugger to be unable to find breakpoints.
Workaround I used is to start app in debug mode (not debug as native app but 'regular' debug) and then in command line I went to my project root and typed ndk-gdb
(this creates gdb.setup
file in obj/local/armeabi
folder). After that breakpoints worked as usual.
In comments related to the issue on the link above they suggest some other workarounds but I didn't try them since they seemed to require more effort than this.
add a comment |
up vote
1
down vote
You can also a little util
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Usage:
std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());
add a comment |
up vote
0
down vote
No one has posted info about different log levels so far. The answer is an attempt to make the logging "picture" full.
#include <android/log.h>
#define TAG "MY_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
Usage:
LOGE("Something went wrong")
Link Android log library as below.
Android.mk:
LOCAL_LDLIBS := -llog
CMakeLists.txt:
find_library( log-lib log )
target_link_libraries( ${log-lib} )
Further reading: Logging
add a comment |
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
112
down vote
accepted
You can use the Android logging facilities:
#include <android/log.h>
#define APPNAME "MyApp"
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
Make sure you also link against the logging library, in your Android.mk file:
LOCAL_LDLIBS := -llog
1
If using the new Gradle NDK integration in Android Studio (Gradle experimental), you need to add this line ldLibs.addAll(['android','log']) to your android.ndk options .
– Sadegh Ghanbari
Nov 1 '16 at 16:21
add a comment |
up vote
112
down vote
accepted
You can use the Android logging facilities:
#include <android/log.h>
#define APPNAME "MyApp"
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
Make sure you also link against the logging library, in your Android.mk file:
LOCAL_LDLIBS := -llog
1
If using the new Gradle NDK integration in Android Studio (Gradle experimental), you need to add this line ldLibs.addAll(['android','log']) to your android.ndk options .
– Sadegh Ghanbari
Nov 1 '16 at 16:21
add a comment |
up vote
112
down vote
accepted
up vote
112
down vote
accepted
You can use the Android logging facilities:
#include <android/log.h>
#define APPNAME "MyApp"
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
Make sure you also link against the logging library, in your Android.mk file:
LOCAL_LDLIBS := -llog
You can use the Android logging facilities:
#include <android/log.h>
#define APPNAME "MyApp"
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
Make sure you also link against the logging library, in your Android.mk file:
LOCAL_LDLIBS := -llog
answered Jan 7 '11 at 20:03
svdree
11.3k42220
11.3k42220
1
If using the new Gradle NDK integration in Android Studio (Gradle experimental), you need to add this line ldLibs.addAll(['android','log']) to your android.ndk options .
– Sadegh Ghanbari
Nov 1 '16 at 16:21
add a comment |
1
If using the new Gradle NDK integration in Android Studio (Gradle experimental), you need to add this line ldLibs.addAll(['android','log']) to your android.ndk options .
– Sadegh Ghanbari
Nov 1 '16 at 16:21
1
1
If using the new Gradle NDK integration in Android Studio (Gradle experimental), you need to add this line ldLibs.addAll(['android','log']) to your android.ndk options .
– Sadegh Ghanbari
Nov 1 '16 at 16:21
If using the new Gradle NDK integration in Android Studio (Gradle experimental), you need to add this line ldLibs.addAll(['android','log']) to your android.ndk options .
– Sadegh Ghanbari
Nov 1 '16 at 16:21
add a comment |
up vote
12
down vote
The easiest way is probably to redirect printf() statements to the system log (based on the "Viewing stdout and stderr" section of the official ADB reference manual.
Type these 3 commands on a command line:
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Then you can view the output of your "printf()" statements by looking at the "LogCat" window of Eclipse Debugger, or by typing this on a command line:
adb logcat
Just be aware that since the data is buffered before transferring from the emulator or device, you should definitely flush the stdout buffer, eg:
printf("Hello, I am %d years old!n", 30);
fflush(stdout);
You should then see a log message starting with "I/stdout:"
4
Note that this solution breaks JUnit tests. See: stackoverflow.com/questions/3462850/…
– Sebastian Krysmanski
May 10 '12 at 7:28
fflush
has to be called after every printf statement?
– Igor Ganapolsky
Apr 12 '16 at 17:56
add a comment |
up vote
12
down vote
The easiest way is probably to redirect printf() statements to the system log (based on the "Viewing stdout and stderr" section of the official ADB reference manual.
Type these 3 commands on a command line:
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Then you can view the output of your "printf()" statements by looking at the "LogCat" window of Eclipse Debugger, or by typing this on a command line:
adb logcat
Just be aware that since the data is buffered before transferring from the emulator or device, you should definitely flush the stdout buffer, eg:
printf("Hello, I am %d years old!n", 30);
fflush(stdout);
You should then see a log message starting with "I/stdout:"
4
Note that this solution breaks JUnit tests. See: stackoverflow.com/questions/3462850/…
– Sebastian Krysmanski
May 10 '12 at 7:28
fflush
has to be called after every printf statement?
– Igor Ganapolsky
Apr 12 '16 at 17:56
add a comment |
up vote
12
down vote
up vote
12
down vote
The easiest way is probably to redirect printf() statements to the system log (based on the "Viewing stdout and stderr" section of the official ADB reference manual.
Type these 3 commands on a command line:
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Then you can view the output of your "printf()" statements by looking at the "LogCat" window of Eclipse Debugger, or by typing this on a command line:
adb logcat
Just be aware that since the data is buffered before transferring from the emulator or device, you should definitely flush the stdout buffer, eg:
printf("Hello, I am %d years old!n", 30);
fflush(stdout);
You should then see a log message starting with "I/stdout:"
The easiest way is probably to redirect printf() statements to the system log (based on the "Viewing stdout and stderr" section of the official ADB reference manual.
Type these 3 commands on a command line:
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Then you can view the output of your "printf()" statements by looking at the "LogCat" window of Eclipse Debugger, or by typing this on a command line:
adb logcat
Just be aware that since the data is buffered before transferring from the emulator or device, you should definitely flush the stdout buffer, eg:
printf("Hello, I am %d years old!n", 30);
fflush(stdout);
You should then see a log message starting with "I/stdout:"
edited Aug 11 '11 at 8:28
answered Aug 11 '11 at 6:32
Shervin Emami
2,2982017
2,2982017
4
Note that this solution breaks JUnit tests. See: stackoverflow.com/questions/3462850/…
– Sebastian Krysmanski
May 10 '12 at 7:28
fflush
has to be called after every printf statement?
– Igor Ganapolsky
Apr 12 '16 at 17:56
add a comment |
4
Note that this solution breaks JUnit tests. See: stackoverflow.com/questions/3462850/…
– Sebastian Krysmanski
May 10 '12 at 7:28
fflush
has to be called after every printf statement?
– Igor Ganapolsky
Apr 12 '16 at 17:56
4
4
Note that this solution breaks JUnit tests. See: stackoverflow.com/questions/3462850/…
– Sebastian Krysmanski
May 10 '12 at 7:28
Note that this solution breaks JUnit tests. See: stackoverflow.com/questions/3462850/…
– Sebastian Krysmanski
May 10 '12 at 7:28
fflush
has to be called after every printf statement?– Igor Ganapolsky
Apr 12 '16 at 17:56
fflush
has to be called after every printf statement?– Igor Ganapolsky
Apr 12 '16 at 17:56
add a comment |
up vote
2
down vote
An alternative solution (using a debugger) is explained here:
How can I effectively debug C code that's wrapped with JNI in Eclipse? (Android Dev)
add a comment |
up vote
2
down vote
An alternative solution (using a debugger) is explained here:
How can I effectively debug C code that's wrapped with JNI in Eclipse? (Android Dev)
add a comment |
up vote
2
down vote
up vote
2
down vote
An alternative solution (using a debugger) is explained here:
How can I effectively debug C code that's wrapped with JNI in Eclipse? (Android Dev)
An alternative solution (using a debugger) is explained here:
How can I effectively debug C code that's wrapped with JNI in Eclipse? (Android Dev)
edited May 23 '17 at 12:26
Community♦
11
11
answered Feb 9 '11 at 8:05
Chris
3,34311615
3,34311615
add a comment |
add a comment |
up vote
2
down vote
ADT 20 includes an NDK plugin that provides support for building and debugging NDK projects in Eclipse. This document describes how to install and use the NDK plugin. Instructions are pretty straightforward and consist of only a few steps.
This is the simplest solution I found and it worked for me.
Note: If you are using ADT bundle you only need to install C development tools with install new software (see the screenshot) and you can go to "Using the NDK plugin" part immediately.
Edit: It seems there is an issue with CDT in eclipse juno http://code.google.com/p/android/issues/detail?id=33788 causing eclipse's debugger to be unable to find breakpoints.
Workaround I used is to start app in debug mode (not debug as native app but 'regular' debug) and then in command line I went to my project root and typed ndk-gdb
(this creates gdb.setup
file in obj/local/armeabi
folder). After that breakpoints worked as usual.
In comments related to the issue on the link above they suggest some other workarounds but I didn't try them since they seemed to require more effort than this.
add a comment |
up vote
2
down vote
ADT 20 includes an NDK plugin that provides support for building and debugging NDK projects in Eclipse. This document describes how to install and use the NDK plugin. Instructions are pretty straightforward and consist of only a few steps.
This is the simplest solution I found and it worked for me.
Note: If you are using ADT bundle you only need to install C development tools with install new software (see the screenshot) and you can go to "Using the NDK plugin" part immediately.
Edit: It seems there is an issue with CDT in eclipse juno http://code.google.com/p/android/issues/detail?id=33788 causing eclipse's debugger to be unable to find breakpoints.
Workaround I used is to start app in debug mode (not debug as native app but 'regular' debug) and then in command line I went to my project root and typed ndk-gdb
(this creates gdb.setup
file in obj/local/armeabi
folder). After that breakpoints worked as usual.
In comments related to the issue on the link above they suggest some other workarounds but I didn't try them since they seemed to require more effort than this.
add a comment |
up vote
2
down vote
up vote
2
down vote
ADT 20 includes an NDK plugin that provides support for building and debugging NDK projects in Eclipse. This document describes how to install and use the NDK plugin. Instructions are pretty straightforward and consist of only a few steps.
This is the simplest solution I found and it worked for me.
Note: If you are using ADT bundle you only need to install C development tools with install new software (see the screenshot) and you can go to "Using the NDK plugin" part immediately.
Edit: It seems there is an issue with CDT in eclipse juno http://code.google.com/p/android/issues/detail?id=33788 causing eclipse's debugger to be unable to find breakpoints.
Workaround I used is to start app in debug mode (not debug as native app but 'regular' debug) and then in command line I went to my project root and typed ndk-gdb
(this creates gdb.setup
file in obj/local/armeabi
folder). After that breakpoints worked as usual.
In comments related to the issue on the link above they suggest some other workarounds but I didn't try them since they seemed to require more effort than this.
ADT 20 includes an NDK plugin that provides support for building and debugging NDK projects in Eclipse. This document describes how to install and use the NDK plugin. Instructions are pretty straightforward and consist of only a few steps.
This is the simplest solution I found and it worked for me.
Note: If you are using ADT bundle you only need to install C development tools with install new software (see the screenshot) and you can go to "Using the NDK plugin" part immediately.
Edit: It seems there is an issue with CDT in eclipse juno http://code.google.com/p/android/issues/detail?id=33788 causing eclipse's debugger to be unable to find breakpoints.
Workaround I used is to start app in debug mode (not debug as native app but 'regular' debug) and then in command line I went to my project root and typed ndk-gdb
(this creates gdb.setup
file in obj/local/armeabi
folder). After that breakpoints worked as usual.
In comments related to the issue on the link above they suggest some other workarounds but I didn't try them since they seemed to require more effort than this.
edited May 7 '13 at 11:00
answered May 3 '13 at 11:19
draganstankovic
3,84612027
3,84612027
add a comment |
add a comment |
up vote
1
down vote
You can also a little util
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Usage:
std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());
add a comment |
up vote
1
down vote
You can also a little util
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Usage:
std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());
add a comment |
up vote
1
down vote
up vote
1
down vote
You can also a little util
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Usage:
std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());
You can also a little util
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Usage:
std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());
answered Nov 5 at 12:36
Geng Jiawen
3,9492526
3,9492526
add a comment |
add a comment |
up vote
0
down vote
No one has posted info about different log levels so far. The answer is an attempt to make the logging "picture" full.
#include <android/log.h>
#define TAG "MY_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
Usage:
LOGE("Something went wrong")
Link Android log library as below.
Android.mk:
LOCAL_LDLIBS := -llog
CMakeLists.txt:
find_library( log-lib log )
target_link_libraries( ${log-lib} )
Further reading: Logging
add a comment |
up vote
0
down vote
No one has posted info about different log levels so far. The answer is an attempt to make the logging "picture" full.
#include <android/log.h>
#define TAG "MY_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
Usage:
LOGE("Something went wrong")
Link Android log library as below.
Android.mk:
LOCAL_LDLIBS := -llog
CMakeLists.txt:
find_library( log-lib log )
target_link_libraries( ${log-lib} )
Further reading: Logging
add a comment |
up vote
0
down vote
up vote
0
down vote
No one has posted info about different log levels so far. The answer is an attempt to make the logging "picture" full.
#include <android/log.h>
#define TAG "MY_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
Usage:
LOGE("Something went wrong")
Link Android log library as below.
Android.mk:
LOCAL_LDLIBS := -llog
CMakeLists.txt:
find_library( log-lib log )
target_link_libraries( ${log-lib} )
Further reading: Logging
No one has posted info about different log levels so far. The answer is an attempt to make the logging "picture" full.
#include <android/log.h>
#define TAG "MY_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
Usage:
LOGE("Something went wrong")
Link Android log library as below.
Android.mk:
LOCAL_LDLIBS := -llog
CMakeLists.txt:
find_library( log-lib log )
target_link_libraries( ${log-lib} )
Further reading: Logging
answered Nov 10 at 14:26
Onik
10.9k103760
10.9k103760
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f4629308%2fany-simple-or-easy-way-to-log-in-android-ndk-code%23new-answer', 'question_page');
}
);
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password