从Android JNI程序调用的Log API是什么?

hop*_*pia 53 c android android-ndk android-emulator

我想通过向logcat插入日志消息来调试JNI C应用程序.执行此操作的C API是什么?

Rya*_*ves 99

像这样:

#include <android/log.h>


__android_log_write(ANDROID_LOG_ERROR, "Tag", "Error here");//Or ANDROID_LOG_INFO, ...  
Run Code Online (Sandbox Code Playgroud)

将它添加到您的makefile中,如下所示:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
Run Code Online (Sandbox Code Playgroud)

  • 或__android_log_print(ANDROID_LOG_INFO,"Tag","i%c works lik%x print%x","t",14,15); (6认同)
  • "-L $(SYSROOT)/ usr/lib"部分不是必需的,只是"LOCAL_LDLIBS:= -llog"将起作用.对于那些它无论如何都不起作用(像我一样)) - 我在我的Android.mk _after_"LOCAL_LDLIBS:= -llog"中有一行"include $(CLEAR_VARS)",将它移动_before_,现在它运行正常. (3认同)

mk.*_*k.. 10

以下是您应包含在本机代码中的代码段.

#include <android/log.h>


__android_log_write(ANDROID_LOG_ERROR, "Tag", "Error msg");//Or ANDROID_LOG_INFO, ...  
Run Code Online (Sandbox Code Playgroud)

为了使用上面的API,我们需要链接相应的库.

我们可以通过3种方式链接Android中的共享库.在以下3个案例中,应加入所述行Android.mk

所以这有三种方式.

#1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog
Run Code Online (Sandbox Code Playgroud)

出于某种原因,如果1不起作用(它对我不起作用),你可以尝试以下两种方式

#2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

#3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog
Run Code Online (Sandbox Code Playgroud)


Cir*_*四事件 5

syslog

该POSIX函数也输出到logcat。

与非Android系统相比__android_log_write,它具有更大的可移植性,并且可以自动将应用程序包添加到日志中。

使用以下示例应用程序进行了测试:https : //github.com/cirosantilli/android-cheat/tree/a080f5c370c1f06e74a8300fb4a2e93369861047/gradle/NdkSyslog NDK源是:

#include <jni.h>
#include <string>
#include <syslog.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_cirosantilli_android_1cheat_ndksyslog_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    syslog(LOG_CRIT, "hello syslog");
    return env->NewStringUTF("Check adb logcat");
}
Run Code Online (Sandbox Code Playgroud)

logcat现在包含:

01-14 15:39:07.582  3633  3633 E com.cirosantilli.android_cheat.ndksyslog: hello syslog  
Run Code Online (Sandbox Code Playgroud)

已在Android O HiKey 960上测试。