summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToby Gray <toby.gray@realvnc.com>2013-07-09 16:43:53 +0100
committerPete Batard <pete@akeo.ie>2013-08-11 22:12:03 +0100
commit7bfbb8b331fc09d5ad64dbcbc6730f5d1d3c0933 (patch)
tree1113166e3afb8bc113b8649f511bc36b18af489b
parent9222a548bdea026c89057b65caf2832785ea702e (diff)
downloadlibusb-7bfbb8b331fc09d5ad64dbcbc6730f5d1d3c0933.tar.gz
Android: Add formal Android support
* Also fix an issue with LIBUSB_LOG_LEVEL_NONE
-rw-r--r--android/README24
-rw-r--r--android/config.h90
-rw-r--r--android/jni/Android.mk69
-rw-r--r--android/jni/Application.mk19
-rw-r--r--libusb/core.c35
-rw-r--r--libusb/os/threads_posix.c4
-rw-r--r--libusb/version_nano.h2
7 files changed, 216 insertions, 27 deletions
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. <toby.gray@realvnc.com>
+ *
+ * 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 <dlfcn.h> 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 <inttypes.h> 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 <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <poll.h> header file. */
+#define HAVE_POLL_H 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <linux/filter.h> header file. */
+#define HAVE_LINUX_FILTER_H 1
+
+/* Define to 1 if you have the <linux/netlink.h> header file. */
+#define HAVE_LINUX_NETLINK_H 1
+
+/* Define to 1 if you have the <asm/types.h> header file. */
+#define HAVE_ASM_TYPES_H 1
+
+/* Define to 1 if you have the <sys/socket.h> 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. <toby.gray@realvnc.com>
+#
+# 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. <toby.gray@realvnc.com>
+#
+# 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