* commit 'd732f561b24e643676812855396d0c9b9138b4c8': jni: Resolve build warnings jni: Incorporate liblog reading API
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2007 The Android Open Source Project
|
* Copyright (C) 2007-2014 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -21,6 +21,8 @@
|
|||||||
#include "jni.h"
|
#include "jni.h"
|
||||||
#include "log/logger.h"
|
#include "log/logger.h"
|
||||||
|
|
||||||
|
#define UNUSED __attribute__((__unused__))
|
||||||
|
|
||||||
// The size of the tag number comes out of the payload size.
|
// The size of the tag number comes out of the payload size.
|
||||||
#define MAX_EVENT_PAYLOAD (LOGGER_ENTRY_MAX_PAYLOAD - sizeof(int32_t))
|
#define MAX_EVENT_PAYLOAD (LOGGER_ENTRY_MAX_PAYLOAD - sizeof(int32_t))
|
||||||
|
|
||||||
@@ -44,7 +46,8 @@ static jclass gStringClass;
|
|||||||
* In class android.util.EventLog:
|
* In class android.util.EventLog:
|
||||||
* static native int writeEvent(int tag, int value)
|
* static native int writeEvent(int tag, int value)
|
||||||
*/
|
*/
|
||||||
static jint android_util_EventLog_writeEvent_Integer(JNIEnv* env, jobject clazz,
|
static jint android_util_EventLog_writeEvent_Integer(JNIEnv* env UNUSED,
|
||||||
|
jobject clazz UNUSED,
|
||||||
jint tag, jint value)
|
jint tag, jint value)
|
||||||
{
|
{
|
||||||
return android_btWriteLog(tag, EVENT_TYPE_INT, &value, sizeof(value));
|
return android_btWriteLog(tag, EVENT_TYPE_INT, &value, sizeof(value));
|
||||||
@@ -54,7 +57,8 @@ static jint android_util_EventLog_writeEvent_Integer(JNIEnv* env, jobject clazz,
|
|||||||
* In class android.util.EventLog:
|
* In class android.util.EventLog:
|
||||||
* static native int writeEvent(long tag, long value)
|
* static native int writeEvent(long tag, long value)
|
||||||
*/
|
*/
|
||||||
static jint android_util_EventLog_writeEvent_Long(JNIEnv* env, jobject clazz,
|
static jint android_util_EventLog_writeEvent_Long(JNIEnv* env UNUSED,
|
||||||
|
jobject clazz UNUSED,
|
||||||
jint tag, jlong value)
|
jint tag, jlong value)
|
||||||
{
|
{
|
||||||
return android_btWriteLog(tag, EVENT_TYPE_LONG, &value, sizeof(value));
|
return android_btWriteLog(tag, EVENT_TYPE_LONG, &value, sizeof(value));
|
||||||
@@ -64,7 +68,8 @@ static jint android_util_EventLog_writeEvent_Long(JNIEnv* env, jobject clazz,
|
|||||||
* In class android.util.EventLog:
|
* In class android.util.EventLog:
|
||||||
* static native int writeEvent(int tag, String value)
|
* static native int writeEvent(int tag, String value)
|
||||||
*/
|
*/
|
||||||
static jint android_util_EventLog_writeEvent_String(JNIEnv* env, jobject clazz,
|
static jint android_util_EventLog_writeEvent_String(JNIEnv* env,
|
||||||
|
jobject clazz UNUSED,
|
||||||
jint tag, jstring value) {
|
jint tag, jstring value) {
|
||||||
uint8_t buf[MAX_EVENT_PAYLOAD];
|
uint8_t buf[MAX_EVENT_PAYLOAD];
|
||||||
|
|
||||||
@@ -142,18 +147,21 @@ static jint android_util_EventLog_writeEvent_Array(JNIEnv* env, jobject clazz,
|
|||||||
* In class android.util.EventLog:
|
* In class android.util.EventLog:
|
||||||
* static native void readEvents(int[] tags, Collection<Event> output)
|
* static native void readEvents(int[] tags, Collection<Event> output)
|
||||||
*
|
*
|
||||||
* Reads events from the event log, typically /dev/log/events
|
* Reads events from the event log
|
||||||
*/
|
*/
|
||||||
static void android_util_EventLog_readEvents(JNIEnv* env, jobject clazz,
|
static void android_util_EventLog_readEvents(JNIEnv* env, jobject clazz UNUSED,
|
||||||
jintArray tags,
|
jintArray tags,
|
||||||
jobject out) {
|
jobject out) {
|
||||||
|
|
||||||
if (tags == NULL || out == NULL) {
|
if (tags == NULL || out == NULL) {
|
||||||
jniThrowNullPointerException(env, NULL);
|
jniThrowNullPointerException(env, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd = open("/dev/" LOGGER_LOG_EVENTS, O_RDONLY | O_NONBLOCK);
|
struct logger_list *logger_list = android_logger_list_open(
|
||||||
if (fd < 0) {
|
LOG_ID_EVENTS, O_RDONLY | O_NONBLOCK, 0, 0);
|
||||||
|
|
||||||
|
if (!logger_list) {
|
||||||
jniThrowIOException(env, errno);
|
jniThrowIOException(env, errno);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -161,41 +169,26 @@ static void android_util_EventLog_readEvents(JNIEnv* env, jobject clazz,
|
|||||||
jsize tagLength = env->GetArrayLength(tags);
|
jsize tagLength = env->GetArrayLength(tags);
|
||||||
jint *tagValues = env->GetIntArrayElements(tags, NULL);
|
jint *tagValues = env->GetIntArrayElements(tags, NULL);
|
||||||
|
|
||||||
uint8_t buf[LOGGER_ENTRY_MAX_LEN];
|
while (1) {
|
||||||
struct timeval timeout = {0, 0};
|
log_msg log_msg;
|
||||||
fd_set readset;
|
int ret = android_logger_list_read(logger_list, &log_msg);
|
||||||
FD_ZERO(&readset);
|
|
||||||
|
|
||||||
for (;;) {
|
if (ret == 0) {
|
||||||
// Use a short select() to try to avoid problems hanging on read().
|
break;
|
||||||
// This means we block for 5ms at the end of the log -- oh well.
|
}
|
||||||
timeout.tv_usec = 5000;
|
if (ret < 0) {
|
||||||
FD_SET(fd, &readset);
|
if (errno == EINTR) {
|
||||||
int r = select(fd + 1, &readset, NULL, NULL, &timeout);
|
continue;
|
||||||
if (r == 0) {
|
}
|
||||||
break; // no more events
|
if (errno == EINVAL) {
|
||||||
} else if (r < 0 && errno == EINTR) {
|
jniThrowException(env, "java/io/IOException", "Event too short");
|
||||||
continue; // interrupted by signal, try again
|
} else if (errno != EAGAIN) {
|
||||||
} else if (r < 0) {
|
jniThrowIOException(env, errno); // Will throw on return
|
||||||
jniThrowIOException(env, errno); // Will throw on return
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int len = read(fd, buf, sizeof(buf));
|
int32_t tag = * (int32_t *) log_msg.msg();
|
||||||
if (len == 0 || (len < 0 && errno == EAGAIN)) {
|
|
||||||
break; // no more events
|
|
||||||
} else if (len < 0 && errno == EINTR) {
|
|
||||||
continue; // interrupted by signal, try again
|
|
||||||
} else if (len < 0) {
|
|
||||||
jniThrowIOException(env, errno); // Will throw on return
|
|
||||||
break;
|
|
||||||
} else if ((size_t) len < sizeof(logger_entry) + sizeof(int32_t)) {
|
|
||||||
jniThrowException(env, "java/io/IOException", "Event too short");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger_entry* entry = (logger_entry*) buf;
|
|
||||||
int32_t tag = * (int32_t*) (buf + sizeof(*entry));
|
|
||||||
|
|
||||||
int found = 0;
|
int found = 0;
|
||||||
for (int i = 0; !found && i < tagLength; ++i) {
|
for (int i = 0; !found && i < tagLength; ++i) {
|
||||||
@@ -203,16 +196,20 @@ static void android_util_EventLog_readEvents(JNIEnv* env, jobject clazz,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
jsize len = sizeof(*entry) + entry->len;
|
jsize len = ret;
|
||||||
jbyteArray array = env->NewByteArray(len);
|
jbyteArray array = env->NewByteArray(len);
|
||||||
if (array == NULL) break;
|
if (array == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
jbyte *bytes = env->GetByteArrayElements(array, NULL);
|
jbyte *bytes = env->GetByteArrayElements(array, NULL);
|
||||||
memcpy(bytes, buf, len);
|
memcpy(bytes, log_msg.buf, len);
|
||||||
env->ReleaseByteArrayElements(array, bytes, 0);
|
env->ReleaseByteArrayElements(array, bytes, 0);
|
||||||
|
|
||||||
jobject event = env->NewObject(gEventClass, gEventInitID, array);
|
jobject event = env->NewObject(gEventClass, gEventInitID, array);
|
||||||
if (event == NULL) break;
|
if (event == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
env->CallBooleanMethod(out, gCollectionAddID, event);
|
env->CallBooleanMethod(out, gCollectionAddID, event);
|
||||||
env->DeleteLocalRef(event);
|
env->DeleteLocalRef(event);
|
||||||
@@ -220,7 +217,8 @@ static void android_util_EventLog_readEvents(JNIEnv* env, jobject clazz,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd);
|
android_logger_list_close(logger_list);
|
||||||
|
|
||||||
env->ReleaseIntArrayElements(tags, tagValues, 0);
|
env->ReleaseIntArrayElements(tags, tagValues, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user