diff --git a/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp b/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp
new file mode 100644
index 0000000..5b542ba
--- /dev/null
+++ b/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp
@@ -0,0 +1,304 @@
+/*
+ * Copyright 2014, 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.
+ */
+
+#define LOG_TAG "ActivityRecognitionHardware"
+
+#include <jni.h>
+#include <JNIHelp.h>
+
+#include <android_runtime/AndroidRuntime.h>
+#include <android_runtime/Log.h>
+
+#include "activity_recognition.h"
+
+
+// keep base connection data from the HAL
+static activity_recognition_module_t* sModule = NULL;
+static activity_recognition_device_t* sDevice = NULL;
+
+static jobject sCallbacksObject = NULL;
+static jmethodID sOnActivityChanged = NULL;
+
+
+static void check_and_clear_exceptions(JNIEnv* env, const char* method_name) {
+    if (!env->ExceptionCheck()) {
+        return;
+    }
+
+    ALOGE("An exception was thrown by '%s'.", method_name);
+    LOGE_EX(env);
+    env->ExceptionClear();
+}
+
+static jint attach_thread(JNIEnv** env) {
+    JavaVM* java_vm = android::AndroidRuntime::getJavaVM();
+    assert(java_vm != NULL);
+
+    JavaVMAttachArgs args = {
+        JNI_VERSION_1_6,
+        "ActivityRecognition HAL callback.",
+        NULL /* group */
+    };
+
+    jint result = java_vm->AttachCurrentThread(env, &args);
+    if (result != JNI_OK) {
+        ALOGE("Attach to callback thread failed: %d", result);
+    }
+
+    return result;
+}
+
+static jint detach_thread() {
+    JavaVM* java_vm = android::AndroidRuntime::getJavaVM();
+    assert(java_vm != NULL);
+
+    jint result = java_vm->DetachCurrentThread();
+    if (result != JNI_OK) {
+        ALOGE("Detach of callback thread failed: %d", result);
+    }
+
+    return result;
+}
+
+
+/**
+ * Handle activity recognition events from HAL.
+ */
+static void activity_callback(
+        const activity_recognition_callback_procs_t* procs,
+        const activity_event_t* events,
+        int count) {
+    if (sOnActivityChanged == NULL) {
+        ALOGE("Dropping activity_callback because onActivityChanged handler is null.");
+        return;
+    }
+
+    if (events == NULL || count <= 0) {
+        ALOGE("Invalid activity_callback. Count: %d, Events: %p", count, events);
+        return;
+    }
+
+    JNIEnv* env = NULL;
+    int result = attach_thread(&env);
+    if (result != JNI_OK) {
+        return;
+    }
+
+    jclass event_class =
+            env->FindClass("android/hardware/location/ActivityRecognitionHardware$Event");
+    jmethodID event_ctor = env->GetMethodID(event_class, "<init>", "()V");
+    jfieldID activity_field = env->GetFieldID(event_class, "activity", "I");
+    jfieldID type_field = env->GetFieldID(event_class, "type", "I");
+    jfieldID timestamp_field = env->GetFieldID(event_class, "timestamp", "J");
+
+    jobjectArray events_array = env->NewObjectArray(count, event_class, NULL);
+    for (int i = 0; i < count; ++i) {
+        const activity_event_t* event = &events[i];
+        jobject event_object = env->NewObject(event_class, event_ctor);
+        env->SetIntField(event_object, activity_field, event->activity);
+        env->SetIntField(event_object, type_field, event->event_type);
+        env->SetLongField(event_object, timestamp_field, event->timestamp);
+        env->SetObjectArrayElement(events_array, i, event_object);
+        env->DeleteLocalRef(event_object);
+    }
+
+    env->CallVoidMethod(sCallbacksObject, sOnActivityChanged, events_array);
+    check_and_clear_exceptions(env, __FUNCTION__);
+
+    // TODO: ideally we'd let the HAL register the callback thread only once
+    detach_thread();
+}
+
+activity_recognition_callback_procs_t sCallbacks {
+    activity_callback,
+};
+
+/**
+ * Initializes the ActivityRecognitionHardware class from the native side.
+ */
+static void class_init(JNIEnv* env, jclass clazz) {
+    // open the hardware module
+    int error = hw_get_module(
+            ACTIVITY_RECOGNITION_HARDWARE_MODULE_ID,
+            (const hw_module_t**) &sModule);
+    if (error != 0) {
+        ALOGE("Error hw_get_module: %d", error);
+        return;
+    }
+
+    error = activity_recognition_open(&sModule->common, &sDevice);
+    if (error != 0) {
+        ALOGE("Error opening device: %d", error);
+        return;
+    }
+
+    // get references to the Java provided methods
+    sOnActivityChanged = env->GetMethodID(
+            clazz,
+            "onActivityChanged",
+            "([Landroid/hardware/location/ActivityRecognitionHardware$Event;)V");
+    if (sOnActivityChanged == NULL) {
+        ALOGE("Error obtaining ActivityChanged callback.");
+        return;
+    }
+
+    // register callbacks
+    sDevice->register_activity_callback(sDevice, &sCallbacks);
+}
+
+/**
+ * Initializes and connect the callbacks handlers in the HAL.
+ */
+static void initialize(JNIEnv* env, jobject obj) {
+    if (sCallbacksObject == NULL) {
+        sCallbacksObject = env->NewGlobalRef(obj);
+    } else {
+        ALOGD("Callbacks Object was already initialized.");
+    }
+
+    if (sDevice != NULL) {
+        sDevice->register_activity_callback(sDevice, &sCallbacks);
+    } else {
+        ALOGD("ActivityRecognition device not found during initialization.");
+    }
+}
+
+/**
+ * De-initializes the ActivityRecognitionHardware from the native side.
+ */
+static void release(JNIEnv* env, jobject obj) {
+    if (sDevice == NULL) {
+        return;
+    }
+
+    int error = activity_recognition_close(sDevice);
+    if (error != 0) {
+        ALOGE("Error closing device: %d", error);
+        return;
+    }
+}
+
+/**
+ * Returns true if ActivityRecognition HAL is supported, false otherwise.
+ */
+static jboolean is_supported(JNIEnv* env, jclass clazz) {
+    if (sModule != NULL && sDevice != NULL ) {
+        return JNI_TRUE;
+    }
+    return JNI_FALSE;
+}
+
+/**
+ * Gets an array representing the supported activities.
+ */
+static jobjectArray get_supported_activities(JNIEnv* env, jobject obj) {
+    if (sModule == NULL) {
+        return NULL;
+    }
+
+    char const* const* list = NULL;
+    int list_size = sModule->get_supported_activities_list(sModule, &list);
+    if (list_size <= 0 || list == NULL) {
+        return NULL;
+    }
+
+    jclass string_class = env->FindClass("java/lang/String;");
+    if (string_class == NULL) {
+        ALOGE("Unable to find String class for supported activities.");
+        return NULL;
+    }
+
+    jobjectArray string_array = env->NewObjectArray(list_size, string_class, NULL);
+    if (string_array == NULL) {
+        ALOGE("Unable to create string array for supported activities.");
+        return NULL;
+    }
+
+    for (int i = 0; i < list_size; ++i) {
+        const char* string_ptr = const_cast<const char*>(list[i]);
+        jsize string_length = strlen(string_ptr);
+        jstring string = env->NewString((const jchar*) string_ptr, string_length);
+        env->SetObjectArrayElement(string_array, i, string);
+
+        // log debugging information in case we need to try to trace issues with the strings
+        if (string_length) {
+            ALOGD("Invalid activity (index=%d) name size: %d", i, string_length);
+        }
+    }
+
+    return string_array;
+}
+
+/**
+ * Enables a given activity event to be actively monitored.
+ */
+static int enable_activity_event(
+        JNIEnv* env,
+        jobject obj,
+        jint activity_handle,
+        jint event_type,
+        jlong report_latency_ns) {
+    return sDevice->enable_activity_event(
+            sDevice,
+            (uint32_t) activity_handle,
+            (uint32_t) event_type,
+            report_latency_ns);
+}
+
+/**
+ * Disables a given activity event from being actively monitored.
+ */
+static int disable_activity_event(
+        JNIEnv* env,
+        jobject obj,
+        jint activity_handle,
+        jint event_type) {
+    return sDevice->disable_activity_event(
+            sDevice,
+            (uint32_t) activity_handle,
+            (uint32_t) event_type);
+}
+
+/**
+ * Request flush for al batch buffers.
+ */
+static int flush(JNIEnv* env, jobject obj) {
+    return sDevice->flush(sDevice);
+}
+
+
+static JNINativeMethod sMethods[] = {
+    // {"name", "signature", (void*) functionPointer },
+    { "nativeClassInit", "()V", (void*) class_init },
+    { "nativeInitialize", "()V", (void*) initialize },
+    { "nativeRelease", "()V", (void*) release },
+    { "nativeIsSupported", "()Z", (void*) is_supported },
+    { "nativeGetSupportedActivities", "()[Ljava/lang/String;", (void*) get_supported_activities },
+    { "nativeEnableActivityEvent", "(IIJ)I", (void*) enable_activity_event },
+    { "nativeDisableActivityEvent", "(II)I", (void*) disable_activity_event },
+    { "nativeFlush", "()I", (void*) flush },
+};
+
+/**
+ * Registration method invoked in JNI load.
+ */
+int register_android_hardware_location_ActivityRecognitionHardware(JNIEnv* env) {
+    return jniRegisterNativeMethods(
+            env,
+            "android/hardware/location/ActivityRecognitionHardware",
+            sMethods,
+            NELEM(sMethods));
+}
