summaryrefslogtreecommitdiffstats
path: root/src/plugins/sensors/android/src/androidjnisensors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/sensors/android/src/androidjnisensors.cpp')
-rw-r--r--src/plugins/sensors/android/src/androidjnisensors.cpp277
1 files changed, 0 insertions, 277 deletions
diff --git a/src/plugins/sensors/android/src/androidjnisensors.cpp b/src/plugins/sensors/android/src/androidjnisensors.cpp
deleted file mode 100644
index 5e0e4146..00000000
--- a/src/plugins/sensors/android/src/androidjnisensors.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 BogDan Vatra <bogdan@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtSensors module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qglobal.h>
-#include <android/log.h>
-#include <QtCore/QReadWriteLock>
-#include <QtCore/QHash>
-
-#include "androidjnisensors.h"
-
-static JavaVM *javaVM = 0;
-jclass sensorsClass;
-
-static jmethodID getSensorListMethodId;
-static jmethodID registerSensorMethodId;
-static jmethodID unregisterSensorMethodId;
-static jmethodID getSensorDescriptionMethodId;
-static jmethodID getSensorMaximumRangeMethodId;
-static jmethodID getCompassAzimuthId;
-
-static QHash<int, QList<AndroidSensors::AndroidSensorsListenerInterface *> > listenersHash;
-QReadWriteLock listenersLocker;
-enum {
- SENSOR_DELAY_FASTEST = 0,
- SENSOR_DELAY_GAME = 1,
- SENSOR_DELAY_NORMAL = 3,
- SENSOR_DELAY_UI =2
-};
-namespace AndroidSensors
-{
- struct AttachedJNIEnv
- {
- AttachedJNIEnv()
- {
- attached = false;
- if (javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) < 0) {
- if (javaVM->AttachCurrentThread(&jniEnv, NULL) < 0) {
- __android_log_print(ANDROID_LOG_ERROR, "Qt", "AttachCurrentThread failed");
- jniEnv = 0;
- return;
- }
- attached = true;
- }
- }
-
- ~AttachedJNIEnv()
- {
- if (attached)
- javaVM->DetachCurrentThread();
- }
- bool attached;
- JNIEnv *jniEnv;
- };
-
- QVector<AndroidSensorType> availableSensors()
- {
- QVector<AndroidSensorType> ret;
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return ret;
- jintArray jsensors = static_cast<jintArray>(aenv.jniEnv->CallStaticObjectMethod(sensorsClass,
- getSensorListMethodId));
- jint *sensors = aenv.jniEnv->GetIntArrayElements(jsensors, 0);
- const uint sz = aenv.jniEnv->GetArrayLength(jsensors);
- for (uint i = 0; i < sz; i++)
- ret.push_back(AndroidSensorType(sensors[i]));
- aenv.jniEnv->ReleaseIntArrayElements(jsensors, sensors, 0);
- return ret;
- }
-
- QString sensorDescription(AndroidSensorType sensor)
- {
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return QString();
- jstring jstr = static_cast<jstring>(aenv.jniEnv->CallStaticObjectMethod(sensorsClass,
- getSensorDescriptionMethodId,
- jint(sensor)));
- if (!jstr)
- return QString();
- const jchar *pstr = aenv.jniEnv->GetStringChars(jstr, 0);
- QString ret(reinterpret_cast<const QChar *>(pstr), aenv.jniEnv->GetStringLength(jstr));
- aenv.jniEnv->ReleaseStringChars(jstr, pstr);
- aenv.jniEnv->DeleteLocalRef(jstr);
- return ret;
- }
-
- qreal sensorMaximumRange(AndroidSensorType sensor)
- {
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return 0;
- jfloat range = aenv.jniEnv->CallStaticFloatMethod(sensorsClass, getSensorMaximumRangeMethodId, jint(sensor));
- return range;
- }
-
- bool registerListener(AndroidSensorType sensor, AndroidSensorsListenerInterface *listener, int dataRate)
- {
- listenersLocker.lockForWrite();
- bool startService = listenersHash[sensor].empty();
- listenersHash[sensor].push_back(listener);
- listenersLocker.unlock();
- if (startService) {
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return false;
- int rate = dataRate > 0 ? 1000000/dataRate : SENSOR_DELAY_GAME;
- return aenv.jniEnv->CallStaticBooleanMethod(sensorsClass,
- registerSensorMethodId,
- jint(sensor),
- jint(rate));
- }
- return true;
- }
-
- bool unregisterListener(AndroidSensorType sensor, AndroidSensorsListenerInterface *listener)
- {
- listenersLocker.lockForWrite();
- listenersHash[sensor].removeOne(listener);
- bool stopService = listenersHash[sensor].empty();
- if (stopService)
- listenersHash.remove(sensor);
- listenersLocker.unlock();
- if (stopService) {
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return false;
- return aenv.jniEnv->CallStaticBooleanMethod(sensorsClass, unregisterSensorMethodId, jint(sensor));
- }
- return true;
- }
-
- qreal getCompassAzimuth(jfloat *accelerometerReading, jfloat *magnetometerReading)
- {
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return 0.0;
- return aenv.jniEnv->CallStaticFloatMethod(sensorsClass, getCompassAzimuthId,
- accelerometerReading[0],
- accelerometerReading[1],
- accelerometerReading[2],
- magnetometerReading[0],
- magnetometerReading[1],
- magnetometerReading[2]);
- }
-}
-
-static const char logTag[] = "Qt";
-static const char classErrorMsg[] = "Can't find class \"%s\"";
-static const char methodErrorMsg[] = "Can't find method \"%s%s\"";
-
-static void accuracyChanged(JNIEnv * /*env*/, jobject /*thiz*/, jint sensor, jint accuracy)
-{
- listenersLocker.lockForRead();
- foreach (AndroidSensors::AndroidSensorsListenerInterface *listener, listenersHash[sensor])
- listener->onAccuracyChanged(accuracy);
- listenersLocker.unlock();
-}
-
-static void sensorChanged(JNIEnv *env, jobject /*thiz*/, jint sensor, jlong timeStamp, jfloatArray array)
-{
- uint size = env->GetArrayLength(array);
- jfloat *values = env->GetFloatArrayElements(array, 0);
- listenersLocker.lockForRead();
- foreach (AndroidSensors::AndroidSensorsListenerInterface *listener, listenersHash[sensor])
- listener->onSensorChanged(timeStamp, values, size);
- listenersLocker.unlock();
- env->ReleaseFloatArrayElements(array, values, JNI_ABORT); // don't copy back the elements
-
-}
-
-static JNINativeMethod methods[] = {
- {"accuracyChanged", "(II)V", (void *)accuracyChanged},
- {"sensorChanged", "(IJ[F)V", (void *)sensorChanged}
-};
-
-#define FIND_AND_CHECK_CLASS(CLASS_NAME) \
-clazz = env->FindClass(CLASS_NAME); \
-if (!clazz) { \
- __android_log_print(ANDROID_LOG_FATAL, logTag, classErrorMsg, CLASS_NAME); \
- return JNI_FALSE; \
-}
-
-#define GET_AND_CHECK_STATIC_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE) \
-VAR = env->GetStaticMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE); \
-if (!VAR) { \
- __android_log_print(ANDROID_LOG_FATAL, logTag, methodErrorMsg, METHOD_NAME, METHOD_SIGNATURE); \
- return JNI_FALSE; \
-}
-
-static bool registerNatives(JNIEnv *env)
-{
- jclass clazz;
- FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/sensors/QtSensors");
- sensorsClass = static_cast<jclass>(env->NewGlobalRef(clazz));
-
- if (env->RegisterNatives(sensorsClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) {
- __android_log_print(ANDROID_LOG_FATAL, logTag, "RegisterNatives failed");
- return JNI_FALSE;
- }
-
- GET_AND_CHECK_STATIC_METHOD(getSensorListMethodId, sensorsClass, "getSensorList", "()[I");
- GET_AND_CHECK_STATIC_METHOD(registerSensorMethodId, sensorsClass, "registerSensor", "(II)Z");
- GET_AND_CHECK_STATIC_METHOD(unregisterSensorMethodId, sensorsClass, "unregisterSensor", "(I)Z");
- GET_AND_CHECK_STATIC_METHOD(getSensorDescriptionMethodId, sensorsClass, "getSensorDescription", "(I)Ljava/lang/String;");
- GET_AND_CHECK_STATIC_METHOD(getSensorMaximumRangeMethodId, sensorsClass, "getSensorMaximumRange", "(I)F");
- GET_AND_CHECK_STATIC_METHOD(getCompassAzimuthId, sensorsClass, "getCompassAzimuth", "(FFFFFF)F");
-
- return true;
-}
-
-Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
-{
- static bool initialized = false;
- if (initialized)
- return JNI_VERSION_1_6;
- initialized = true;
-
- typedef union {
- JNIEnv *nativeEnvironment;
- void *venv;
- } UnionJNIEnvToVoid;
-
- __android_log_print(ANDROID_LOG_INFO, logTag, "Sensors start");
- UnionJNIEnvToVoid uenv;
- uenv.venv = NULL;
- javaVM = 0;
-
- if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
- __android_log_print(ANDROID_LOG_FATAL, logTag, "GetEnv failed");
- return -1;
- }
- JNIEnv *env = uenv.nativeEnvironment;
- if (!registerNatives(env)) {
- __android_log_print(ANDROID_LOG_FATAL, logTag, "registerNatives failed");
- return -1;
- }
-
- javaVM = vm;
- return JNI_VERSION_1_4;
-}