blob: c9d609c315370cc61a92de602f0e5870549dcec1 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright 2008, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mike Lockwood270e87f2009-05-22 10:02:14 -040017#define LOG_TAG "SensorManager"
18
destradaa9ba7c1c2015-02-10 15:04:43 -080019#include <map>
20
Aravind Akella88445992015-02-26 17:05:28 -080021#include <ScopedUtfChars.h>
Jeff Brown3b4049e2015-04-17 15:22:27 -070022#include <ScopedLocalRef.h>
Aravind Akella88445992015-02-26 17:05:28 -080023
Mathias Agopiandb772d82013-01-31 19:31:12 -080024#include <utils/Log.h>
25#include <utils/Looper.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080026
Mathias Agopian1bf79782010-07-14 23:41:37 -070027#include <gui/Sensor.h>
28#include <gui/SensorManager.h>
29#include <gui/SensorEventQueue.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030
31#include "jni.h"
32#include "JNIHelp.h"
Mathias Agopiandb772d82013-01-31 19:31:12 -080033#include "android_os_MessageQueue.h"
34#include <android_runtime/AndroidRuntime.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035
Andreas Gampe987f79f2014-11-18 17:29:46 -080036#include "core_jni_helpers.h"
37
Mathias Agopiandb772d82013-01-31 19:31:12 -080038static struct {
39 jclass clazz;
40 jmethodID dispatchSensorEvent;
Aravind Akellab4c76b12013-06-27 12:04:16 -070041 jmethodID dispatchFlushCompleteEvent;
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -080042} gBaseEventQueueClassInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043
44namespace android {
45
46struct SensorOffsets
47{
48 jfieldID name;
49 jfieldID vendor;
50 jfieldID version;
51 jfieldID handle;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052 jfieldID range;
53 jfieldID resolution;
54 jfieldID power;
Mathias Agopian050b5622010-07-29 16:51:38 -070055 jfieldID minDelay;
Aravind Akellab4c76b12013-06-27 12:04:16 -070056 jfieldID fifoReservedEventCount;
57 jfieldID fifoMaxEventCount;
Aravind Akellacd9a7bb2014-04-07 22:55:21 +000058 jfieldID stringType;
59 jfieldID requiredPermission;
Aravind Akella2f8b9142014-05-12 14:39:29 -070060 jfieldID maxDelay;
Aravind Akella27900352014-06-03 19:20:42 -070061 jfieldID flags;
destradaa9ba7c1c2015-02-10 15:04:43 -080062 jmethodID setType;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080063} gSensorOffsets;
64
Mathias Agopiandb772d82013-01-31 19:31:12 -080065
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080066/*
67 * The method below are not thread-safe and not intended to be
68 */
69
Mathias Agopiandb772d82013-01-31 19:31:12 -080070static void
71nativeClassInit (JNIEnv *_env, jclass _this)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080072{
Mathias Agopiandb772d82013-01-31 19:31:12 -080073 jclass sensorClass = _env->FindClass("android/hardware/Sensor");
74 SensorOffsets& sensorOffsets = gSensorOffsets;
75 sensorOffsets.name = _env->GetFieldID(sensorClass, "mName", "Ljava/lang/String;");
76 sensorOffsets.vendor = _env->GetFieldID(sensorClass, "mVendor", "Ljava/lang/String;");
77 sensorOffsets.version = _env->GetFieldID(sensorClass, "mVersion", "I");
78 sensorOffsets.handle = _env->GetFieldID(sensorClass, "mHandle", "I");
Mathias Agopiandb772d82013-01-31 19:31:12 -080079 sensorOffsets.range = _env->GetFieldID(sensorClass, "mMaxRange", "F");
80 sensorOffsets.resolution = _env->GetFieldID(sensorClass, "mResolution","F");
81 sensorOffsets.power = _env->GetFieldID(sensorClass, "mPower", "F");
82 sensorOffsets.minDelay = _env->GetFieldID(sensorClass, "mMinDelay", "I");
Aravind Akellab4c76b12013-06-27 12:04:16 -070083 sensorOffsets.fifoReservedEventCount =
84 _env->GetFieldID(sensorClass, "mFifoReservedEventCount", "I");
85 sensorOffsets.fifoMaxEventCount = _env->GetFieldID(sensorClass, "mFifoMaxEventCount", "I");
Aravind Akellacd9a7bb2014-04-07 22:55:21 +000086 sensorOffsets.stringType = _env->GetFieldID(sensorClass, "mStringType", "Ljava/lang/String;");
87 sensorOffsets.requiredPermission = _env->GetFieldID(sensorClass, "mRequiredPermission",
88 "Ljava/lang/String;");
Aravind Akella2f8b9142014-05-12 14:39:29 -070089 sensorOffsets.maxDelay = _env->GetFieldID(sensorClass, "mMaxDelay", "I");
Aravind Akella27900352014-06-03 19:20:42 -070090 sensorOffsets.flags = _env->GetFieldID(sensorClass, "mFlags", "I");
destradaa9ba7c1c2015-02-10 15:04:43 -080091 sensorOffsets.setType = _env->GetMethodID(sensorClass, "setType", "(I)Z");
92}
93
94/**
95 * A key comparator predicate.
96 * It is used to intern strings associated with Sensor data.
97 * It defines a 'Strict weak ordering' for the interned strings.
98 */
99class InternedStringCompare {
100public:
101 bool operator()(const String8* string1, const String8* string2) const {
102 if (string1 == NULL) {
103 return string2 != NULL;
104 }
Aravind Akella88445992015-02-26 17:05:28 -0800105 if (string2 == NULL) {
106 return false;
107 }
destradaa9ba7c1c2015-02-10 15:04:43 -0800108 return string1->compare(*string2) < 0;
109 }
110};
111
112/**
113 * A localized interning mechanism for Sensor strings.
114 * We implement our own interning to avoid the overhead of using java.lang.String#intern().
115 * It is common that Vendor, StringType, and RequirePermission data is common between many of the
116 * Sensors, by interning the memory usage to represent Sensors is optimized.
117 */
118static jstring
119getInternedString(JNIEnv *env, const String8* string) {
120 static std::map<const String8*, jstring, InternedStringCompare> internedStrings;
121
122 jstring internedString;
123 std::map<const String8*, jstring>::iterator iterator = internedStrings.find(string);
124 if (iterator != internedStrings.end()) {
125 internedString = iterator->second;
126 } else {
127 jstring localString = env->NewStringUTF(string->string());
128 // we are implementing our own interning so expect these strings to be backed by global refs
129 internedString = (jstring) env->NewGlobalRef(localString);
130 internedStrings.insert(std::make_pair(string, internedString));
131 env->DeleteLocalRef(localString);
132 }
133
134 return internedString;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800135}
136
Svet Ganovb9d71a62015-04-30 10:38:13 -0700137static jlong
138nativeCreate
139(JNIEnv *env, jclass clazz, jstring opPackageName)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800140{
Svet Ganovb9d71a62015-04-30 10:38:13 -0700141 ScopedUtfChars opPackageNameUtf(env, opPackageName);
142 return (jlong) new SensorManager(String16(opPackageNameUtf.c_str()));
143}
144
145static jint
146nativeGetNextSensor(JNIEnv *env, jclass clazz, jlong sensorManager, jobject sensor, jint next)
147{
148 SensorManager* mgr = reinterpret_cast<SensorManager*>(sensorManager);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800149
Mathias Agopian1bf79782010-07-14 23:41:37 -0700150 Sensor const* const* sensorList;
Svet Ganovb9d71a62015-04-30 10:38:13 -0700151 size_t count = mgr->getSensorList(&sensorList);
destradaa9ba7c1c2015-02-10 15:04:43 -0800152 if (size_t(next) >= count) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800153 return -1;
destradaa9ba7c1c2015-02-10 15:04:43 -0800154 }
Aravind Akellab4c76b12013-06-27 12:04:16 -0700155
Mathias Agopian1bf79782010-07-14 23:41:37 -0700156 Sensor const* const list = sensorList[next];
157 const SensorOffsets& sensorOffsets(gSensorOffsets);
destradaa9ba7c1c2015-02-10 15:04:43 -0800158 jstring name = getInternedString(env, &list->getName());
159 jstring vendor = getInternedString(env, &list->getVendor());
160 jstring requiredPermission = getInternedString(env, &list->getRequiredPermission());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800161 env->SetObjectField(sensor, sensorOffsets.name, name);
162 env->SetObjectField(sensor, sensorOffsets.vendor, vendor);
Mathias Agopian277d1b22012-05-04 15:51:29 -0700163 env->SetIntField(sensor, sensorOffsets.version, list->getVersion());
Mathias Agopian1bf79782010-07-14 23:41:37 -0700164 env->SetIntField(sensor, sensorOffsets.handle, list->getHandle());
Mathias Agopian1bf79782010-07-14 23:41:37 -0700165 env->SetFloatField(sensor, sensorOffsets.range, list->getMaxValue());
166 env->SetFloatField(sensor, sensorOffsets.resolution, list->getResolution());
167 env->SetFloatField(sensor, sensorOffsets.power, list->getPowerUsage());
Mathias Agopian050b5622010-07-29 16:51:38 -0700168 env->SetIntField(sensor, sensorOffsets.minDelay, list->getMinDelay());
Aravind Akellab4c76b12013-06-27 12:04:16 -0700169 env->SetIntField(sensor, sensorOffsets.fifoReservedEventCount,
170 list->getFifoReservedEventCount());
Aravind Akellacd9a7bb2014-04-07 22:55:21 +0000171 env->SetIntField(sensor, sensorOffsets.fifoMaxEventCount,
172 list->getFifoMaxEventCount());
Aravind Akellacd9a7bb2014-04-07 22:55:21 +0000173 env->SetObjectField(sensor, sensorOffsets.requiredPermission,
174 requiredPermission);
Aravind Akella2f8b9142014-05-12 14:39:29 -0700175 env->SetIntField(sensor, sensorOffsets.maxDelay, list->getMaxDelay());
Aravind Akella27900352014-06-03 19:20:42 -0700176 env->SetIntField(sensor, sensorOffsets.flags, list->getFlags());
destradaa9ba7c1c2015-02-10 15:04:43 -0800177 if (env->CallBooleanMethod(sensor, sensorOffsets.setType, list->getType()) == JNI_FALSE) {
178 jstring stringType = getInternedString(env, &list->getStringType());
179 env->SetObjectField(sensor, sensorOffsets.stringType, stringType);
180 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800181 next++;
Jeff Brown4fe6c3e2010-09-13 23:17:30 -0700182 return size_t(next) < count ? next : 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800183}
184
Svet Ganovb9d71a62015-04-30 10:38:13 -0700185static int nativeEnableDataInjection(JNIEnv *_env, jclass _this, jlong sensorManager,
186 jboolean enable) {
187 SensorManager* mgr = reinterpret_cast<SensorManager*>(sensorManager);
188 return mgr->enableDataInjection(enable);
Aravind Akella18ebf732b2015-04-20 17:39:51 -0700189}
190
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800191//----------------------------------------------------------------------------
Mathias Agopiandb772d82013-01-31 19:31:12 -0800192
193class Receiver : public LooperCallback {
194 sp<SensorEventQueue> mSensorQueue;
195 sp<MessageQueue> mMessageQueue;
Jeff Brown3b4049e2015-04-17 15:22:27 -0700196 jobject mReceiverWeakGlobal;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800197 jfloatArray mScratch;
198public:
199 Receiver(const sp<SensorEventQueue>& sensorQueue,
200 const sp<MessageQueue>& messageQueue,
Jeff Brown3b4049e2015-04-17 15:22:27 -0700201 jobject receiverWeak, jfloatArray scratch) {
Mathias Agopiandb772d82013-01-31 19:31:12 -0800202 JNIEnv* env = AndroidRuntime::getJNIEnv();
203 mSensorQueue = sensorQueue;
204 mMessageQueue = messageQueue;
Jeff Brown3b4049e2015-04-17 15:22:27 -0700205 mReceiverWeakGlobal = env->NewGlobalRef(receiverWeak);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800206 mScratch = (jfloatArray)env->NewGlobalRef(scratch);
207 }
208 ~Receiver() {
209 JNIEnv* env = AndroidRuntime::getJNIEnv();
Jeff Brown3b4049e2015-04-17 15:22:27 -0700210 env->DeleteGlobalRef(mReceiverWeakGlobal);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800211 env->DeleteGlobalRef(mScratch);
212 }
213 sp<SensorEventQueue> getSensorEventQueue() const {
214 return mSensorQueue;
215 }
216
217 void destroy() {
218 mMessageQueue->getLooper()->removeFd( mSensorQueue->getFd() );
219 }
220
221private:
222 virtual void onFirstRef() {
223 LooperCallback::onFirstRef();
224 mMessageQueue->getLooper()->addFd(mSensorQueue->getFd(), 0,
225 ALOOPER_EVENT_INPUT, this, mSensorQueue.get());
226 }
227
228 virtual int handleEvent(int fd, int events, void* data) {
229 JNIEnv* env = AndroidRuntime::getJNIEnv();
230 sp<SensorEventQueue> q = reinterpret_cast<SensorEventQueue *>(data);
Jeff Brown3b4049e2015-04-17 15:22:27 -0700231 ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
232
Mathias Agopiandb772d82013-01-31 19:31:12 -0800233 ssize_t n;
234 ASensorEvent buffer[16];
235 while ((n = q->read(buffer, 16)) > 0) {
236 for (int i=0 ; i<n ; i++) {
Aravind Akella0288ca62014-07-28 14:53:44 -0700237 if (buffer[i].type == SENSOR_TYPE_STEP_COUNTER) {
Jean-Baptiste Queru3c9c0912013-08-05 11:03:28 -0700238 // step-counter returns a uint64, but the java API only deals with floats
239 float value = float(buffer[i].u64.step_counter);
240 env->SetFloatArrayRegion(mScratch, 0, 1, &value);
241 } else {
242 env->SetFloatArrayRegion(mScratch, 0, 16, buffer[i].data);
243 }
Mathias Agopiandb772d82013-01-31 19:31:12 -0800244
Aravind Akellab4c76b12013-06-27 12:04:16 -0700245 if (buffer[i].type == SENSOR_TYPE_META_DATA) {
246 // This is a flush complete sensor event. Call dispatchFlushCompleteEvent
247 // method.
Jeff Brown3b4049e2015-04-17 15:22:27 -0700248 if (receiverObj.get()) {
249 env->CallVoidMethod(receiverObj.get(),
250 gBaseEventQueueClassInfo.dispatchFlushCompleteEvent,
251 buffer[i].meta_data.sensor);
252 }
Aravind Akellab4c76b12013-06-27 12:04:16 -0700253 } else {
Etienne Le Grandaf805102014-05-16 12:21:41 -0700254 int8_t status;
255 switch (buffer[i].type) {
256 case SENSOR_TYPE_ORIENTATION:
257 case SENSOR_TYPE_MAGNETIC_FIELD:
258 case SENSOR_TYPE_ACCELEROMETER:
259 case SENSOR_TYPE_GYROSCOPE:
Aravind Akellaf38226a2015-06-23 10:32:16 -0700260 case SENSOR_TYPE_GRAVITY:
261 case SENSOR_TYPE_LINEAR_ACCELERATION:
Etienne Le Grandaf805102014-05-16 12:21:41 -0700262 status = buffer[i].vector.status;
263 break;
264 case SENSOR_TYPE_HEART_RATE:
265 status = buffer[i].heart_rate.status;
266 break;
267 default:
268 status = SENSOR_STATUS_ACCURACY_HIGH;
269 break;
270 }
Jeff Brown3b4049e2015-04-17 15:22:27 -0700271 if (receiverObj.get()) {
272 env->CallVoidMethod(receiverObj.get(),
273 gBaseEventQueueClassInfo.dispatchSensorEvent,
274 buffer[i].sensor,
275 mScratch,
276 status,
277 buffer[i].timestamp);
278 }
Aravind Akellab4c76b12013-06-27 12:04:16 -0700279 }
Mathias Agopiandb772d82013-01-31 19:31:12 -0800280 if (env->ExceptionCheck()) {
Aravind Akella35187bd2014-02-11 18:44:42 -0800281 mSensorQueue->sendAck(buffer, n);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800282 ALOGE("Exception dispatching input event.");
283 return 1;
284 }
285 }
Aravind Akella35187bd2014-02-11 18:44:42 -0800286 mSensorQueue->sendAck(buffer, n);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800287 }
288 if (n<0 && n != -EAGAIN) {
289 // FIXME: error receiving events, what to do in this case?
290 }
Mathias Agopiandb772d82013-01-31 19:31:12 -0800291 return 1;
292 }
293};
294
Svet Ganovb9d71a62015-04-30 10:38:13 -0700295static jlong nativeInitSensorEventQueue(JNIEnv *env, jclass clazz, jlong sensorManager,
296 jobject eventQWeak, jobject msgQ, jfloatArray scratch, jstring packageName, jint mode) {
297 SensorManager* mgr = reinterpret_cast<SensorManager*>(sensorManager);
Aravind Akella88445992015-02-26 17:05:28 -0800298 ScopedUtfChars packageUtf(env, packageName);
299 String8 clientName(packageUtf.c_str());
Svet Ganovb9d71a62015-04-30 10:38:13 -0700300 sp<SensorEventQueue> queue(mgr->createEventQueue(clientName, mode));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800301
Mathias Agopiandb772d82013-01-31 19:31:12 -0800302 sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, msgQ);
303 if (messageQueue == NULL) {
304 jniThrowRuntimeException(env, "MessageQueue is not initialized.");
305 return 0;
Mathias Agopian0b6d77b2012-05-07 18:27:06 -0700306 }
Mathias Agopian1bf79782010-07-14 23:41:37 -0700307
Jeff Brown3b4049e2015-04-17 15:22:27 -0700308 sp<Receiver> receiver = new Receiver(queue, messageQueue, eventQWeak, scratch);
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800309 receiver->incStrong((void*)nativeInitSensorEventQueue);
Ashok Bhat4838e332014-01-03 14:37:19 +0000310 return jlong(receiver.get());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800311}
312
Ashok Bhat4838e332014-01-03 14:37:19 +0000313static jint nativeEnableSensor(JNIEnv *env, jclass clazz, jlong eventQ, jint handle, jint rate_us,
Aravind Akella88445992015-02-26 17:05:28 -0800314 jint maxBatchReportLatency) {
Mathias Agopiandb772d82013-01-31 19:31:12 -0800315 sp<Receiver> receiver(reinterpret_cast<Receiver *>(eventQ));
Aravind Akellab4c76b12013-06-27 12:04:16 -0700316 return receiver->getSensorEventQueue()->enableSensor(handle, rate_us, maxBatchReportLatency,
Aravind Akella88445992015-02-26 17:05:28 -0800317 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800318}
319
Ashok Bhat4838e332014-01-03 14:37:19 +0000320static jint nativeDisableSensor(JNIEnv *env, jclass clazz, jlong eventQ, jint handle) {
Mathias Agopiandb772d82013-01-31 19:31:12 -0800321 sp<Receiver> receiver(reinterpret_cast<Receiver *>(eventQ));
322 return receiver->getSensorEventQueue()->disableSensor(handle);
323}
Mathias Agopian1bf79782010-07-14 23:41:37 -0700324
Aravind Akella18ebf732b2015-04-20 17:39:51 -0700325static void nativeDestroySensorEventQueue(JNIEnv *env, jclass clazz, jlong eventQ) {
Mathias Agopiandb772d82013-01-31 19:31:12 -0800326 sp<Receiver> receiver(reinterpret_cast<Receiver *>(eventQ));
327 receiver->destroy();
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800328 receiver->decStrong((void*)nativeInitSensorEventQueue);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800329}
Mathias Agopian1bf79782010-07-14 23:41:37 -0700330
Ashok Bhat4838e332014-01-03 14:37:19 +0000331static jint nativeFlushSensor(JNIEnv *env, jclass clazz, jlong eventQ) {
Aravind Akellab4c76b12013-06-27 12:04:16 -0700332 sp<Receiver> receiver(reinterpret_cast<Receiver *>(eventQ));
Aravind Akella4bdc37d2013-10-01 17:58:35 -0700333 return receiver->getSensorEventQueue()->flush();
Aravind Akellab4c76b12013-06-27 12:04:16 -0700334}
Mathias Agopiandb772d82013-01-31 19:31:12 -0800335
Aravind Akella18ebf732b2015-04-20 17:39:51 -0700336static jint nativeInjectSensorData(JNIEnv *env, jclass clazz, jlong eventQ, jint handle,
337 jfloatArray values, jint accuracy, jlong timestamp) {
338 sp<Receiver> receiver(reinterpret_cast<Receiver *>(eventQ));
339 // Create a sensor_event from the above data which can be injected into the HAL.
340 ASensorEvent sensor_event;
341 memset(&sensor_event, 0, sizeof(sensor_event));
342 sensor_event.sensor = handle;
343 sensor_event.timestamp = timestamp;
344 env->GetFloatArrayRegion(values, 0, env->GetArrayLength(values), sensor_event.data);
345 return receiver->getSensorEventQueue()->injectSensorEvent(sensor_event);
346}
Mathias Agopiandb772d82013-01-31 19:31:12 -0800347//----------------------------------------------------------------------------
348
349static JNINativeMethod gSystemSensorManagerMethods[] = {
350 {"nativeClassInit",
351 "()V",
352 (void*)nativeClassInit },
Svet Ganovb9d71a62015-04-30 10:38:13 -0700353 {"nativeCreate",
354 "(Ljava/lang/String;)J",
355 (void*)nativeCreate },
Mathias Agopiandb772d82013-01-31 19:31:12 -0800356
357 {"nativeGetNextSensor",
Svet Ganovb9d71a62015-04-30 10:38:13 -0700358 "(JLandroid/hardware/Sensor;I)I",
Mathias Agopiandb772d82013-01-31 19:31:12 -0800359 (void*)nativeGetNextSensor },
Aravind Akella18ebf732b2015-04-20 17:39:51 -0700360
361 {"nativeEnableDataInjection",
Svet Ganovb9d71a62015-04-30 10:38:13 -0700362 "(JZ)I",
Aravind Akella18ebf732b2015-04-20 17:39:51 -0700363 (void*)nativeEnableDataInjection },
Mathias Agopiandb772d82013-01-31 19:31:12 -0800364};
365
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800366static JNINativeMethod gBaseEventQueueMethods[] = {
367 {"nativeInitBaseEventQueue",
Svet Ganovb9d71a62015-04-30 10:38:13 -0700368 "(JLjava/lang/ref/WeakReference;Landroid/os/MessageQueue;[FLjava/lang/String;ILjava/lang/String;)J",
369 (void*)nativeInitSensorEventQueue },
Mathias Agopiandb772d82013-01-31 19:31:12 -0800370
371 {"nativeEnableSensor",
Aravind Akella88445992015-02-26 17:05:28 -0800372 "(JIII)I",
Mathias Agopiandb772d82013-01-31 19:31:12 -0800373 (void*)nativeEnableSensor },
374
375 {"nativeDisableSensor",
Ashok Bhat4838e332014-01-03 14:37:19 +0000376 "(JI)I",
Mathias Agopiandb772d82013-01-31 19:31:12 -0800377 (void*)nativeDisableSensor },
378
379 {"nativeDestroySensorEventQueue",
Ashok Bhat4838e332014-01-03 14:37:19 +0000380 "(J)V",
Mathias Agopiandb772d82013-01-31 19:31:12 -0800381 (void*)nativeDestroySensorEventQueue },
Aravind Akellab4c76b12013-06-27 12:04:16 -0700382
383 {"nativeFlushSensor",
Ashok Bhat4838e332014-01-03 14:37:19 +0000384 "(J)I",
Aravind Akellab4c76b12013-06-27 12:04:16 -0700385 (void*)nativeFlushSensor },
Aravind Akella18ebf732b2015-04-20 17:39:51 -0700386
387 {"nativeInjectSensorData",
388 "(JI[FIJ)I",
389 (void*)nativeInjectSensorData },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800390};
391
392}; // namespace android
393
394using namespace android;
395
396int register_android_hardware_SensorManager(JNIEnv *env)
397{
Andreas Gampe987f79f2014-11-18 17:29:46 -0800398 RegisterMethodsOrDie(env, "android/hardware/SystemSensorManager",
Mathias Agopiandb772d82013-01-31 19:31:12 -0800399 gSystemSensorManagerMethods, NELEM(gSystemSensorManagerMethods));
400
Andreas Gampe987f79f2014-11-18 17:29:46 -0800401 RegisterMethodsOrDie(env, "android/hardware/SystemSensorManager$BaseEventQueue",
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800402 gBaseEventQueueMethods, NELEM(gBaseEventQueueMethods));
Mathias Agopiandb772d82013-01-31 19:31:12 -0800403
Andreas Gampe987f79f2014-11-18 17:29:46 -0800404 gBaseEventQueueClassInfo.clazz = FindClassOrDie(env,
405 "android/hardware/SystemSensorManager$BaseEventQueue");
Mathias Agopiandb772d82013-01-31 19:31:12 -0800406
Andreas Gampe987f79f2014-11-18 17:29:46 -0800407 gBaseEventQueueClassInfo.dispatchSensorEvent = GetMethodIDOrDie(env,
408 gBaseEventQueueClassInfo.clazz, "dispatchSensorEvent", "(I[FIJ)V");
Mathias Agopiandb772d82013-01-31 19:31:12 -0800409
Andreas Gampe987f79f2014-11-18 17:29:46 -0800410 gBaseEventQueueClassInfo.dispatchFlushCompleteEvent = GetMethodIDOrDie(env,
411 gBaseEventQueueClassInfo.clazz, "dispatchFlushCompleteEvent", "(I)V");
Aravind Akellab4c76b12013-06-27 12:04:16 -0700412
Mathias Agopiandb772d82013-01-31 19:31:12 -0800413 return 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800414}