com_android_server_location_GpsLocationProvider.cpp revision b8d9033d9928209e68518c4b12fea74187ddb382
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "GpsLocationProvider" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19b8d9033d9928209e68518c4b12fea74187ddb382Mike Lockwood#define LOG_NDEBUG 0 2022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 23b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood#include "hardware/hardware.h" 24b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood#include "hardware/gps.h" 258f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood#include "hardware_legacy/power.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/misc.h" 28f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood#include "android_runtime/AndroidRuntime.h" 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jobject mCallbacksObj = NULL; 34f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportLocation; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportStatus; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_reportSvStatus; 38e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic jmethodID method_reportAGpsStatus; 39b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic jmethodID method_reportNmea; 4004598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jmethodID method_setEngineCapabilities; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID method_xtraDownloadRequest; 4222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jmethodID method_reportNiNotification; 431e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestRefLocation; 441e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic jmethodID method_requestSetID; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsInterface* sGpsInterface = NULL; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const GpsXtraInterface* sGpsXtraInterface = NULL; 48e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic const AGpsInterface* sAGpsInterface = NULL; 4922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic const GpsNiInterface* sGpsNiInterface = NULL; 503c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic const GpsDebugInterface* sGpsDebugInterface = NULL; 511e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic const AGpsRilInterface* sAGpsRilInterface = NULL; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood// temporary storage for GPS callbacks 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GpsSvStatus sGpsSvStatus; 55f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic const char* sNmeaString; 56f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic int sNmeaStringLength; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 588f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood#define WAKE_LOCK_NAME "GPS" 598f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 63f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (env->ExceptionCheck()) { 64f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood LOGE("An exception was thrown by callback '%s'.", methodName); 65f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood LOGE_EX(env); 66f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ExceptionClear(); 67f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 68f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 69f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void location_callback(GpsLocation* location) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 72f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 73f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportLocation, location->flags, 74f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->latitude, (jdouble)location->longitude, 75f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jdouble)location->altitude, 76f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->speed, (jfloat)location->bearing, 77f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood (jfloat)location->accuracy, (jlong)location->timestamp); 78f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void status_callback(GpsStatus* status) 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 83f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 84f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportStatus, status->status); 85f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void sv_status_callback(GpsSvStatus* sv_status) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 90f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 91f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(&sGpsSvStatus, sv_status, sizeof(sGpsSvStatus)); 92f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportSvStatus); 93f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 96b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwoodstatic void nmea_callback(GpsUtcTime timestamp, const char* nmea, int length) 97b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 98f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 99f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // The Java code will call back to read these values 100f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // We do this to avoid creating unnecessary String objects 101f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaString = nmea; 102f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood sNmeaStringLength = length; 103f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp); 104f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 105b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 106b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 10704598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic void set_capabilities_callback(uint32_t capabilities) 10804598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 109b8d9033d9928209e68518c4b12fea74187ddb382Mike Lockwood LOGD("set_capabilities_callback: %ld\n", capabilities); 110f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 111f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_setEngineCapabilities, capabilities); 112f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 11304598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 11404598b67a58fad93e5060bb77756ba4863013aedMike Lockwood 1158f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void acquire_wakelock_callback() 1168f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1178f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME); 1188f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1198f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 1208f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwoodstatic void release_wakelock_callback() 1218f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood{ 1228f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wake_lock(WAKE_LOCK_NAME); 1238f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood} 1248f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood 125f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic pthread_t create_thread_callback(const char* name, void (*start)(void *), void* arg) 12658bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 127f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood return (pthread_t)AndroidRuntime::createJavaThread(name, start, arg); 12858bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 12958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsCallbacks sGpsCallbacks = { 1318f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood sizeof(GpsCallbacks), 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location_callback, 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_callback, 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sv_status_callback, 1358f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood nmea_callback, 13604598b67a58fad93e5060bb77756ba4863013aedMike Lockwood set_capabilities_callback, 1378f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood acquire_wakelock_callback, 1388f5a800116f700b0af21d2a8468165bcf51b841cMike Lockwood release_wakelock_callback, 139f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 142f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void xtra_download_request_callback() 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 144f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 145f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_xtraDownloadRequest); 146f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 14722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 14822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGpsXtraCallbacks sGpsXtraCallbacks = { 150f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood xtra_download_request_callback, 151f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 154f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void agps_status_callback(AGpsStatus* agps_status) 155f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 156f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 157f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus, 158f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood agps_status->type, agps_status->status); 159f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 160f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 161f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 162e3635c9693c4cd9650684f14e19dcabcea0d488aMike LockwoodAGpsCallbacks sAGpsCallbacks = { 163e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood agps_status_callback, 164f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 16558bda987665af759c379cd494ff4873ac61acf29Mike Lockwood}; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 167f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void gps_ni_notify_callback(GpsNiNotification *notification) 168f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood{ 169f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood LOGD("gps_ni_notify_callback\n"); 170f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 171f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring requestor_id = env->NewStringUTF(notification->requestor_id); 172f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring text = env->NewStringUTF(notification->text); 173f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jstring extras = env->NewStringUTF(notification->extras); 174f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 175f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id && text && extras) { 176f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->CallVoidMethod(mCallbacksObj, method_reportNiNotification, 177f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notification_id, notification->ni_type, 178f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->notify_flags, notification->timeout, 179f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->default_response, requestor_id, text, 180f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->requestor_id_encoding, 181f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood notification->text_encoding, extras); 182f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } else { 183f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood LOGE("out of memory in gps_ni_notify_callback\n"); 184f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood } 185f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 186f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (requestor_id) 187f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(requestor_id); 188f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (text) 189f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(text); 190f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood if (extras) 191f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->DeleteLocalRef(extras); 192f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 193f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood} 194f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood 19522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke XieGpsNiCallbacks sGpsNiCallbacks = { 19622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie gps_ni_notify_callback, 197f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood create_thread_callback, 19822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie}; 19922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 2001e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_set_id(uint32_t flags) 2011e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 2021e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja LOGD("agps_request_set_id: flags (%d)", flags); 2031e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2041e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 2051e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestSetID, flags); 2061e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 2071e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 2081e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2091e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void agps_request_ref_location(uint32_t flags) 2101e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 2111e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja LOGD("agps_ref_location: flags (%d)", flags); 2121e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2131e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja JNIEnv* env = AndroidRuntime::getJNIEnv(); 2141e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->CallVoidMethod(mCallbacksObj, method_requestRefLocation, flags); 2151e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja checkAndClearExceptionFromCallback(env, __FUNCTION__); 2161e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 2171e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 2181e84da822e7aa4d494b31c8759917d2751611f84Miguel TorrojaAGpsRilCallbacks sAGpsRilCallbacks = { 2191e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_set_id, 2201e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja agps_request_ref_location, 2211e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja create_thread_callback, 2221e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja}; 2231e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 224b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwoodstatic const GpsInterface* get_gps_interface() { 225b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood int err; 226b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood hw_module_t* module; 227b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood const GpsInterface* interface = NULL; 228b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood 229b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 230b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood if (err == 0) { 231b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood hw_device_t* device; 232b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device); 233b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood if (err == 0) { 234b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood gps_device_t* gps_device = (gps_device_t *)device; 235b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood interface = gps_device->get_gps_interface(gps_device); 236b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood } 237b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood } 238b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood 239b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood return interface; 240b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood} 241b7ff4574b5a8273b0ff43ca7f490ba5ceec42912Mike Lockwood 24201df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwoodstatic const GpsInterface* GetGpsInterface(JNIEnv* env, jobject obj) { 24301df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood // this must be set before calling into the HAL library 24401df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood if (!mCallbacksObj) 24501df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood mCallbacksObj = env->NewGlobalRef(obj); 24601df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood 247b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood if (!sGpsInterface) { 248b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood sGpsInterface = get_gps_interface(); 249b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) { 250b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood sGpsInterface = NULL; 251b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood return NULL; 252b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood } 253b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood } 254b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood return sGpsInterface; 255b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood} 256b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood 25701df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwoodstatic const AGpsInterface* GetAGpsInterface(JNIEnv* env, jobject obj) 258bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood{ 25901df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 260b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood if (!interface) 261bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return NULL; 262bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 263bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!sAGpsInterface) { 264b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood sAGpsInterface = (const AGpsInterface*)interface->get_extension(AGPS_INTERFACE); 265bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (sAGpsInterface) 266bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood sAGpsInterface->init(&sAGpsCallbacks); 267bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 268bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return sAGpsInterface; 269bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood} 270bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 27101df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwoodstatic const GpsNiInterface* GetNiInterface(JNIEnv* env, jobject obj) 272bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood{ 27301df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 274b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood if (!interface) 275bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return NULL; 276bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 277bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!sGpsNiInterface) { 278b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood sGpsNiInterface = (const GpsNiInterface*)interface->get_extension(GPS_NI_INTERFACE); 279bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (sGpsNiInterface) 280bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood sGpsNiInterface->init(&sGpsNiCallbacks); 281bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 282bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return sGpsNiInterface; 283bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood} 284bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 28501df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwoodstatic const AGpsRilInterface* GetAGpsRilInterface(JNIEnv* env, jobject obj) 286bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood{ 28701df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 288b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood if (!interface) 289bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return NULL; 290bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 291bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!sAGpsRilInterface) { 292b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood sAGpsRilInterface = (const AGpsRilInterface*)interface->get_extension(AGPS_RIL_INTERFACE); 293bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (sAGpsRilInterface) 294bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood sAGpsRilInterface->init(&sAGpsRilCallbacks); 295bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 296bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return sAGpsRilInterface; 297bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood} 298bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 299bea3118337ebb92b953960122af55ee88eeb35faMike Lockwoodstatic void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz) { 300bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportLocation = env->GetMethodID(clazz, "reportLocation", "(IDDDFFFJ)V"); 301bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V"); 302bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "()V"); 303bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II)V"); 304bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V"); 305bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_setEngineCapabilities = env->GetMethodID(clazz, "setEngineCapabilities", "(I)V"); 306bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V"); 307bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification", "(IIIIILjava/lang/String;Ljava/lang/String;IILjava/lang/String;)V"); 308bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestRefLocation = env->GetMethodID(clazz,"requestRefLocation","(I)V"); 309bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood method_requestSetID = env->GetMethodID(clazz,"requestSetID","(I)V"); 310bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood} 311bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz) { 313b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood return (sGpsInterface != NULL || get_gps_interface() != NULL); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj) 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 31801df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 319b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood if (!interface) 32058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood return false; 32158bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 3223c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (!sGpsDebugInterface) 323b6e5fa895c03eeefaa810eaceb498254096c093dMike Lockwood sGpsDebugInterface = (const GpsDebugInterface*)interface->get_extension(GPS_DEBUG_INTERFACE); 3243c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 325c21a08f747f6fd1d7b8c98176ff70abc57cf58a0Mike Lockwood return true; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_cleanup(JNIEnv* env, jobject obj) 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33001df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 3314270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (interface) 3324270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood interface->cleanup(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33504598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_set_position_mode(JNIEnv* env, jobject obj, 33604598b67a58fad93e5060bb77756ba4863013aedMike Lockwood jint mode, jint recurrence, jint min_interval, jint preferred_accuracy, jint preferred_time) 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33801df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 3394270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (interface) 3404270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return (interface->set_position_mode(mode, recurrence, min_interval, preferred_accuracy, 3414270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood preferred_time) == 0); 3424270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 3434270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 34404598b67a58fad93e5060bb77756ba4863013aedMike Lockwood} 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34604598b67a58fad93e5060bb77756ba4863013aedMike Lockwoodstatic jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj) 34704598b67a58fad93e5060bb77756ba4863013aedMike Lockwood{ 34801df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 3494270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (interface) 3504270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return (interface->start() == 0); 3514270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 3524270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_stop(JNIEnv* env, jobject obj) 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 35701df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 3584270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (interface) 3594270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return (interface->stop() == 0); 3604270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood else 3614270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_location_GpsLocationProvider_delete_aiding_data(JNIEnv* env, jobject obj, jint flags) 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 36601df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 3674270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (interface) 3684270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood interface->delete_aiding_data(flags); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic jint android_location_GpsLocationProvider_read_sv_status(JNIEnv* env, jobject obj, 37222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jintArray prnArray, jfloatArray snrArray, jfloatArray elevArray, jfloatArray azumArray, 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray maskArray) 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 375f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportSvStatus 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* prns = env->GetIntArrayElements(prnArray, 0); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* snrs = env->GetFloatArrayElements(snrArray, 0); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* elev = env->GetFloatArrayElements(elevArray, 0); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* azim = env->GetFloatArrayElements(azumArray, 0); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* mask = env->GetIntArrayElements(maskArray, 0); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 383f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int num_svs = sGpsSvStatus.num_svs; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < num_svs; i++) { 385f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood prns[i] = sGpsSvStatus.sv_list[i].prn; 386f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood snrs[i] = sGpsSvStatus.sv_list[i].snr; 387f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood elev[i] = sGpsSvStatus.sv_list[i].elevation; 388f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood azim[i] = sGpsSvStatus.sv_list[i].azimuth; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 390f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[0] = sGpsSvStatus.ephemeris_mask; 391f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[1] = sGpsSvStatus.almanac_mask; 392f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood mask[2] = sGpsSvStatus.used_in_fix_mask; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(prnArray, prns, 0); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(snrArray, snrs, 0); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(elevArray, elev, 0); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseFloatArrayElements(azumArray, azim, 0); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseIntArrayElements(maskArray, mask, 0); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return num_svs; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4021e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_reference_location_cellid(JNIEnv* env, 4031e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jint mcc, jint mnc, jint lac, jint cid) 4041e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 4051e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja AGpsRefLocation location; 40601df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const AGpsRilInterface* interface = GetAGpsRilInterface(env, obj); 407bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 408bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no AGPS RIL interface in agps_set_reference_location_cellid"); 4091e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 410bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 411bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 4121e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja switch(type) { 4131e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_GSM_CELLID: 4141e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja case AGPS_REF_LOCATION_TYPE_UMTS_CELLID: 4151e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.type = type; 4161e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mcc = mcc; 4171e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.mnc = mnc; 4181e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.lac = lac; 4191e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja location.u.cellID.cid = cid; 4201e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 4211e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja default: 4221e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja LOGE("Neither a GSM nor a UMTS cellid (%s:%d).",__FUNCTION__,__LINE__); 4231e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 4241e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja break; 4251e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja } 426bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->set_ref_location(&location, sizeof(location)); 4271e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 4281e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 4291e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_send_ni_message(JNIEnv* env, 4301e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jbyteArray ni_msg, jint size) 4311e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 4321e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja size_t sz; 43301df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const AGpsRilInterface* interface = GetAGpsRilInterface(env, obj); 434bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 435bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no AGPS RIL interface in send_ni_message"); 4361e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 437bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 4381e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja if (size < 0) 4391e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 4401e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja sz = (size_t)size; 4411e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jbyte* b = env->GetByteArrayElements(ni_msg, 0); 442bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->ni_message((uint8_t *)b,sz); 4431e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseByteArrayElements(ni_msg,b,0); 4441e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 4451e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 4461e84da822e7aa4d494b31c8759917d2751611f84Miguel Torrojastatic void android_location_GpsLocationProvider_agps_set_id(JNIEnv *env, 4471e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja jobject obj, jint type, jstring setid_string) 4481e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja{ 44901df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const AGpsRilInterface* interface = GetAGpsRilInterface(env, obj); 450bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 451bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no AGPS RIL interface in agps_set_id"); 4521e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja return; 453bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood } 4541e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 4551e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja const char *setid = env->GetStringUTFChars(setid_string, NULL); 456bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->set_set_id(type, setid); 4571e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja env->ReleaseStringUTFChars(setid_string, setid); 4581e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja} 4591e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja 460f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic jint android_location_GpsLocationProvider_read_nmea(JNIEnv* env, jobject obj, 461f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyteArray nmeaArray, jint buffer_size) 462b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood{ 463f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood // this should only be called from within a call to reportNmea 464f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* nmea = (jbyte *)env->GetPrimitiveArrayCritical(nmeaArray, 0); 465f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood int length = sNmeaStringLength; 466b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood if (length > buffer_size) 467b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood length = buffer_size; 468f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood memcpy(nmea, sNmeaString, length); 469f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT); 470b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood return length; 471b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 472b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 473f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwoodstatic void android_location_GpsLocationProvider_inject_time(JNIEnv* env, jobject obj, 474f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jlong time, jlong timeReference, jint uncertainty) 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 47601df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 4774270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (interface) 4784270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood interface->inject_time(time, timeReference, uncertainty); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 481d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwoodstatic void android_location_GpsLocationProvider_inject_location(JNIEnv* env, jobject obj, 482d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood jdouble latitude, jdouble longitude, jfloat accuracy) 483d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood{ 48401df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 4854270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (interface) 4864270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood interface->inject_location(latitude, longitude, accuracy); 487d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood} 488d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_location_GpsLocationProvider_supports_xtra(JNIEnv* env, jobject obj) 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sGpsXtraInterface) { 49201df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsInterface* interface = GetGpsInterface(env, obj); 4934270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood if (!interface) 4944270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood return false; 4954270237def6c3f67dcdabbb3f27257fe3037c40dMike Lockwood sGpsXtraInterface = (const GpsXtraInterface*)interface->get_extension(GPS_XTRA_INTERFACE); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sGpsXtraInterface) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = sGpsXtraInterface->init(&sGpsXtraCallbacks); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sGpsXtraInterface = NULL; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (sGpsXtraInterface != NULL); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject obj, 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray data, jint length) 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 510f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood jbyte* bytes = (jbyte *)env->GetPrimitiveArrayCritical(data, 0); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sGpsXtraInterface->inject_xtra_data((char *)bytes, length); 512f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood env->ReleasePrimitiveArrayCritical(data, bytes, JNI_ABORT); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 515e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_open(JNIEnv* env, jobject obj, jstring apn) 516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 51701df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const AGpsInterface* interface = GetAGpsInterface(env, obj); 518bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 519bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no AGPS interface in agps_data_conn_open"); 520bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 521105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 522bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (apn == NULL) { 523bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 524bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 525105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 526bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *apnStr = env->GetStringUTFChars(apn, NULL); 527bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->data_conn_open(apnStr); 528bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(apn, apnStr); 529105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 531e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_closed(JNIEnv* env, jobject obj) 532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 53301df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const AGpsInterface* interface = GetAGpsInterface(env, obj); 534bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 535bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no AGPS interface in agps_data_conn_open"); 536bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 53758bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 538bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->data_conn_closed(); 53958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 54058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 541e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_agps_data_conn_failed(JNIEnv* env, jobject obj) 54258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 54301df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const AGpsInterface* interface = GetAGpsInterface(env, obj); 544bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 545bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no AGPS interface in agps_data_conn_open"); 546bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 54758bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 548bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->data_conn_failed(); 54958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood} 55058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood 551e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwoodstatic void android_location_GpsLocationProvider_set_agps_server(JNIEnv* env, jobject obj, 552a9e546169b3c2c9c5f248d2f3abe3b934f48695dMike Lockwood jint type, jstring hostname, jint port) 55358bda987665af759c379cd494ff4873ac61acf29Mike Lockwood{ 55401df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const AGpsInterface* interface = GetAGpsInterface(env, obj); 555bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 556bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no AGPS interface in agps_data_conn_open"); 557bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 558105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 559bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood const char *c_hostname = env->GetStringUTFChars(hostname, NULL); 560bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->set_server(type, c_hostname, port); 561bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood env->ReleaseStringUTFChars(hostname, c_hostname); 562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 563105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 56422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiestatic void android_location_GpsLocationProvider_send_ni_response(JNIEnv* env, jobject obj, 56522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie jint notifId, jint response) 56622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie{ 56701df140b60ce415e89809f2a8fde88cff95daa1bMike Lockwood const GpsNiInterface* interface = GetNiInterface(env, obj); 568bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood if (!interface) { 569bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood LOGE("no NI interface in send_ni_response"); 570bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood return; 5713c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 572bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood 573bea3118337ebb92b953960122af55ee88eeb35faMike Lockwood interface->respond(notifId, response); 5743c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger} 5753c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 5763c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettingerstatic jstring android_location_GpsLocationProvider_get_internal_state(JNIEnv* env, jobject obj) 5773c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger{ 5783c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger jstring result = NULL; 5793c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (sGpsDebugInterface) { 5803c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger const size_t maxLength = 2047; 5813c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger char buffer[maxLength+1]; 5823c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger size_t length = sGpsDebugInterface->get_internal_state(buffer, maxLength); 5833c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger if (length > maxLength) length = maxLength; 5843c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger buffer[length] = 0; 5853c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger result = env->NewStringUTF(buffer); 5863c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 5873c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger return result; 58822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 58922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 59050130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwoodstatic void android_location_GpsLocationProvider_update_network_state(JNIEnv* env, jobject obj, 59150130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood jboolean connected, int type, jboolean roaming, jstring extraInfo) 59250130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood{ 59350130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood const AGpsRilInterface* interface = GetAGpsRilInterface(env, obj); 594f7b7330e710a5f751f9898739378be282471e9efMike Lockwood if (interface && interface->update_network_state) { 59550130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood if (extraInfo) { 59650130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood const char *extraInfoStr = env->GetStringUTFChars(extraInfo, NULL); 59750130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood interface->update_network_state(connected, type, roaming, extraInfoStr); 59850130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood env->ReleaseStringUTFChars(extraInfo, extraInfoStr); 59950130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } else { 60050130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood interface->update_network_state(connected, type, roaming, NULL); 60150130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 60250130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood } 60350130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood} 60450130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod sMethods[] = { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native}, 608e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_is_supported", "()Z", (void*)android_location_GpsLocationProvider_is_supported}, 609e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_init", "()Z", (void*)android_location_GpsLocationProvider_init}, 610e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_cleanup", "()V", (void*)android_location_GpsLocationProvider_cleanup}, 61104598b67a58fad93e5060bb77756ba4863013aedMike Lockwood {"native_set_position_mode", "(IIIII)Z", (void*)android_location_GpsLocationProvider_set_position_mode}, 61204598b67a58fad93e5060bb77756ba4863013aedMike Lockwood {"native_start", "()Z", (void*)android_location_GpsLocationProvider_start}, 613e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_stop", "()Z", (void*)android_location_GpsLocationProvider_stop}, 614e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_delete_aiding_data", "(I)V", (void*)android_location_GpsLocationProvider_delete_aiding_data}, 615e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_read_sv_status", "([I[F[F[F[I)I", (void*)android_location_GpsLocationProvider_read_sv_status}, 616f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood {"native_read_nmea", "([BI)I", (void*)android_location_GpsLocationProvider_read_nmea}, 617e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_inject_time", "(JJI)V", (void*)android_location_GpsLocationProvider_inject_time}, 618d26ce0d903f5141a346d67b2b94437ef3e2880aaMike Lockwood {"native_inject_location", "(DDF)V", (void*)android_location_GpsLocationProvider_inject_location}, 619e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_supports_xtra", "()Z", (void*)android_location_GpsLocationProvider_supports_xtra}, 620e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_inject_xtra_data", "([BI)V", (void*)android_location_GpsLocationProvider_inject_xtra_data}, 621e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_open", "(Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_agps_data_conn_open}, 622e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_closed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_closed}, 623e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood {"native_agps_data_conn_failed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_failed}, 6241e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_set_id","(ILjava/lang/String;)V",(void*)android_location_GpsLocationProvider_agps_set_id}, 6251e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_set_ref_location_cellid","(IIIII)V",(void*)android_location_GpsLocationProvider_agps_set_reference_location_cellid}, 626a9e546169b3c2c9c5f248d2f3abe3b934f48695dMike Lockwood {"native_set_agps_server", "(ILjava/lang/String;I)V", (void*)android_location_GpsLocationProvider_set_agps_server}, 62722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie {"native_send_ni_response", "(II)V", (void*)android_location_GpsLocationProvider_send_ni_response}, 6281e84da822e7aa4d494b31c8759917d2751611f84Miguel Torroja {"native_agps_ni_message", "([BI)V", (void *)android_location_GpsLocationProvider_agps_send_ni_message}, 6293c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger {"native_get_internal_state", "()Ljava/lang/String;", (void*)android_location_GpsLocationProvider_get_internal_state}, 63050130bbc884a7ad7db39dbc4f54e76e8be87761fMike Lockwood {"native_update_network_state", "(ZIZLjava/lang/String;)V", (void*)android_location_GpsLocationProvider_update_network_state }, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63300b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodint register_android_server_location_GpsLocationProvider(JNIEnv* env) 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 63500b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwood return jniRegisterNativeMethods(env, "com/android/server/location/GpsLocationProvider", sMethods, NELEM(sMethods)); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} /* namespace android */ 639