diff --git a/libusbhost/Android.bp b/libusbhost/Android.bp index 38833179b..9ae73d0d8 100644 --- a/libusbhost/Android.bp +++ b/libusbhost/Android.bp @@ -30,11 +30,9 @@ cc_library { export_include_dirs: ["include"], target: { android: { - cflags: [ - "-g", - "-DUSE_LIBLOG", - ], + header_libs: ["jni_headers"], shared_libs: ["liblog"], + srcs: ["usbhost_jni.cpp"], }, darwin: { enabled: false, diff --git a/libusbhost/include/usbhost/usbhost.h b/libusbhost/include/usbhost/usbhost.h index 7e62542ce..01cd68bb9 100644 --- a/libusbhost/include/usbhost/usbhost.h +++ b/libusbhost/include/usbhost/usbhost.h @@ -21,6 +21,7 @@ extern "C" { #endif +#include #include #include diff --git a/libusbhost/include/usbhost/usbhost_jni.h b/libusbhost/include/usbhost/usbhost_jni.h new file mode 100644 index 000000000..4885d457e --- /dev/null +++ b/libusbhost/include/usbhost/usbhost_jni.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +/** + * Reads USB descriptors from `fd`. + * + * Returns a byte[] on success, + * or returns NULL and logs an appropriate error on failure. + */ +jbyteArray usb_jni_read_descriptors(JNIEnv* env, int fd); diff --git a/libusbhost/usbhost.c b/libusbhost/usbhost.c index 3bed0e367..d8f15cd6c 100644 --- a/libusbhost/usbhost.c +++ b/libusbhost/usbhost.c @@ -18,20 +18,9 @@ #define _GNU_SOURCE #endif -// #define DEBUG 1 -#if DEBUG +#include -#ifdef USE_LIBLOG -#define LOG_TAG "usbhost" -#include "log/log.h" -#define D ALOGD -#else -#define D printf -#endif - -#else -#define D(...) -#endif +#include "usbhost_private.h" #include #include @@ -48,12 +37,19 @@ #include #include #include -#include #include -#include -#include "usbhost/usbhost.h" +// #define DEBUG 1 +#if defined(DEBUG) +#if defined(__BIONIC__) +#define D ALOGD +#else +#define D printf +#endif +#else +#define D(...) +#endif #define DEV_DIR "/dev" #define DEV_BUS_DIR DEV_DIR "/bus" @@ -76,8 +72,6 @@ struct usb_host_context { int wddbus; }; -#define MAX_DESCRIPTORS_LENGTH 4096 - struct usb_device { char dev_name[64]; unsigned char desc[MAX_DESCRIPTORS_LENGTH]; diff --git a/libusbhost/usbhost_jni.cpp b/libusbhost/usbhost_jni.cpp new file mode 100644 index 000000000..0da83dc76 --- /dev/null +++ b/libusbhost/usbhost_jni.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "usbhost_private.h" + +#include +#include +#include + +jbyteArray usb_jni_read_descriptors(JNIEnv* env, int fd) { + if (TEMP_FAILURE_RETRY(lseek(fd, 0, SEEK_SET)) == -1) { + ALOGE("usb_jni_read_descriptors(%d): lseek() failed: %s", fd, strerror(errno)); + return NULL; + } + + jbyte buf[MAX_DESCRIPTORS_LENGTH]; + ssize_t n = TEMP_FAILURE_RETRY(read(fd, buf, sizeof(buf))); + if (n == -1) { + ALOGE("usb_jni_read_descriptors: read failed: %s", strerror(errno)); + return NULL; + } + + jbyteArray result = env->NewByteArray(n); + if (result) env->SetByteArrayRegion(result, 0, n, buf); + return result; +} diff --git a/libusbhost/usbhost_private.h b/libusbhost/usbhost_private.h new file mode 100644 index 000000000..72d79384c --- /dev/null +++ b/libusbhost/usbhost_private.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#define LOG_TAG "usbhost" +#include + +// Somewhat arbitrary: Sony has reported needing more than 4KiB (but less +// than 8KiB), and some frameworks code had 16KiB without any explanation, +// so we went with the largest of those. +#define MAX_DESCRIPTORS_LENGTH (16 * 1024)