From 7bfbb8b331fc09d5ad64dbcbc6730f5d1d3c0933 Mon Sep 17 00:00:00 2001 From: Toby Gray Date: Tue, 9 Jul 2013 16:43:53 +0100 Subject: [PATCH] Android: Add formal Android support * Also fix an issue with LIBUSB_LOG_LEVEL_NONE --- android/README | 24 +++++++++++++ android/config.h | 90 ++++++++++++++++++++++++++++++++++++++++++++++ android/jni/Android.mk | 69 +++++++++++++++++++++++++++++++++++ android/jni/Application.mk | 19 ++++++++++ libusb/core.c | 35 ++++++------------ libusb/os/threads_posix.c | 4 ++- libusb/version_nano.h | 2 +- 7 files changed, 216 insertions(+), 27 deletions(-) create mode 100644 android/README create mode 100644 android/config.h create mode 100644 android/jni/Android.mk create mode 100644 android/jni/Application.mk diff --git a/android/README b/android/README new file mode 100644 index 0000000..3bd110d --- /dev/null +++ b/android/README @@ -0,0 +1,24 @@ +libusb for Android +================== + +To build libusb for Android do the following: + + 1. Download the latest NDK from: + http://developer.android.com/tools/sdk/ndk/index.html + + 2. Extract the NDK. + + 3. Open a shell and make sure there exist an NDK global variable + set to the directory where you extracted the NDK. + + 4. Change directory to libusb's "android/jni" + + 5. Run "$NDK/ndk-build". + +The libusb library, examples and tests can then be found in: + "android/libs/$ARCH" + +Where $ARCH is one of: + armeabi + armeabi-v7a + x86 diff --git a/android/config.h b/android/config.h new file mode 100644 index 0000000..c1594cf --- /dev/null +++ b/android/config.h @@ -0,0 +1,90 @@ +/* + * Android build config for libusbx + * Copyright © 2012-2013 RealVNC Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* Start with debug message logging enabled */ +/* #undef ENABLE_DEBUG_LOGGING */ + +/* Message logging */ +#define ENABLE_LOGGING + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Linux backend */ +#define OS_LINUX 1 + +/* Enable output to system log */ +#define USE_SYSTEM_LOGGING_FACILITY 1 + +/* type of second poll() argument */ +#define POLL_NFDS_TYPE nfds_t + +/* Use POSIX Threads */ +#define THREADS_POSIX 1 + +/* Default visibility */ +#define DEFAULT_VISIBILITY __attribute__((visibility("default"))) + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_POLL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LINUX_FILTER_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LINUX_NETLINK_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ASM_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Add defines which Android is missing */ +#ifndef TIMESPEC_TO_TIMEVAL +#define TIMESPEC_TO_TIMEVAL(tv, ts) \ + do { \ + (tv)->tv_sec = (ts)->tv_sec; \ + (tv)->tv_usec = (ts)->tv_nsec / 1000; \ + } while (0) +#endif diff --git a/android/jni/Android.mk b/android/jni/Android.mk new file mode 100644 index 0000000..8f9f66c --- /dev/null +++ b/android/jni/Android.mk @@ -0,0 +1,69 @@ +# +# Android build config for libusbx +# Copyright © 2012-2013 RealVNC Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +LOCAL_PATH:= $(call my-dir) + +# libusb + +include $(CLEAR_VARS) + +LIBUSB_ROOT_REL:= ../.. +LIBUSB_ROOT_ABS:= $(LOCAL_PATH)/../.. + +LOCAL_SRC_FILES := \ + $(LIBUSB_ROOT_REL)/libusb/core.c \ + $(LIBUSB_ROOT_REL)/libusb/descriptor.c \ + $(LIBUSB_ROOT_REL)/libusb/hotplug.c \ + $(LIBUSB_ROOT_REL)/libusb/io.c \ + $(LIBUSB_ROOT_REL)/libusb/sync.c \ + $(LIBUSB_ROOT_REL)/libusb/os/linux_usbfs.c \ + $(LIBUSB_ROOT_REL)/libusb/os/poll_posix.c \ + $(LIBUSB_ROOT_REL)/libusb/os/threads_posix.c \ + $(LIBUSB_ROOT_REL)/libusb/os/linux_netlink.c + +LOCAL_C_INCLUDES += \ + $(LOCAL_PATH)/.. \ + $(LIBUSB_ROOT_ABS)/libusb \ + $(LIBUSB_ROOT_ABS)/libusb/os + +LOCAL_EXPORT_C_INCLUDES := \ + $(LIBUSB_ROOT_ABS)/libusb + +LOCAL_LDLIBS := -llog + +LOCAL_MODULE := libusb1.0 + +include $(BUILD_SHARED_LIBRARY) + + +# listdevs + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + $(LIBUSB_ROOT_REL)/examples/listdevs.c + +LOCAL_C_INCLUDES += \ + $(LIBUSB_ROOT_ABS) + +LOCAL_SHARED_LIBRARIES += libusb1.0 + +LOCAL_MODULE:= listdevs + +include $(BUILD_EXECUTABLE) diff --git a/android/jni/Application.mk b/android/jni/Application.mk new file mode 100644 index 0000000..4ab1012 --- /dev/null +++ b/android/jni/Application.mk @@ -0,0 +1,19 @@ +# Android application build config for libusb +# Copyright © 2012-2013 RealVNC Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +APP_ABI := armeabi armeabi-v7a x86 diff --git a/libusb/core.c b/libusb/core.c index 1418415..4b9ce87 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -2038,6 +2038,15 @@ static void usbi_log_str(struct libusb_context *ctx, WCHAR wbuf[USBI_MAX_LOG_LEN]; MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, sizeof(wbuf)); OutputDebugStringW(wbuf); +#elif defined(__ANDROID__) + int priority = ANDROID_LOG_UNKNOWN; + switch (level) { + case LIBUSB_LOG_LEVEL_INFO: priority = ANDROID_LOG_INFO; break; + case LIBUSB_LOG_LEVEL_WARNING: priority = ANDROID_LOG_WARN; break; + case LIBUSB_LOG_LEVEL_ERROR: priority = ANDROID_LOG_ERROR; break; + case LIBUSB_LOG_LEVEL_DEBUG: priority = ANDROID_LOG_DEBUG; break; + } + __android_log_write(priority, "libusb", str); #elif defined(HAVE_SYSLOG_FUNC) int syslog_level = LOG_INFO; switch (level) { @@ -2045,7 +2054,6 @@ static void usbi_log_str(struct libusb_context *ctx, case LIBUSB_LOG_LEVEL_WARNING: syslog_level = LOG_WARNING; break; case LIBUSB_LOG_LEVEL_ERROR: syslog_level = LOG_ERR; break; case LIBUSB_LOG_LEVEL_DEBUG: syslog_level = LOG_DEBUG; break; - case LIBUSB_LOG_LEVEL_NONE: break; } syslog(syslog_level, "%s", str); #else /* All of gcc, Clang, XCode seem to use #warning */ @@ -2086,28 +2094,6 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, return; #endif -#ifdef __ANDROID__ - int prio; - switch (level) { - case LOG_LEVEL_INFO: - prio = ANDROID_LOG_INFO; - break; - case LOG_LEVEL_WARNING: - prio = ANDROID_LOG_WARN; - break; - case LOG_LEVEL_ERROR: - prio = ANDROID_LOG_ERROR; - break; - case LOG_LEVEL_DEBUG: - prio = ANDROID_LOG_DEBUG; - break; - default: - prio = ANDROID_LOG_UNKNOWN; - break; - } - - __android_log_vprint(prio, "LibUsb", format, args); -#else usbi_gettimeofday(&now, NULL); if ((global_debug) && (!has_debug_header_been_displayed)) { has_debug_header_been_displayed = 1; @@ -2135,7 +2121,7 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, prefix = "debug"; break; case LIBUSB_LOG_LEVEL_NONE: - break; + return; default: prefix = "unknown"; break; @@ -2171,7 +2157,6 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, strcpy(buf + header_len + text_len, USBI_LOG_LINE_END); usbi_log_str(ctx, level, buf); -#endif } void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, diff --git a/libusb/os/threads_posix.c b/libusb/os/threads_posix.c index 9769f58..edf7063 100644 --- a/libusb/os/threads_posix.c +++ b/libusb/os/threads_posix.c @@ -63,7 +63,9 @@ finish: int usbi_get_tid(void) { int ret = -1; -#if defined(__linux__) +#if defined(__ANDROID__) + ret = gettid(); +#elif defined(__linux__) ret = syscall(SYS_gettid); #elif defined(__OpenBSD__) /* The following only works with OpenBSD > 5.1 as it requires diff --git a/libusb/version_nano.h b/libusb/version_nano.h index ab03695..851207a 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 10806 +#define LIBUSB_NANO 10807 -- 2.7.4