【发布时间】:2012-02-17 20:50:06
【问题描述】:
我已经搜索了有关使用 NDK 更快地轮询加速度计的教程/答案,但还没有找到求解器。刚刚找到一个androiddevelopers文档here。
我需要的是每秒大约 100 个样本 (100Hz) 的轮询加速度,默认情况下,我的设备(带有姜饼 2.3.5 的三星 Galaxy SL i9003)默认 SENSOR_DELAY_FASTEST 每秒只能获得大约 60 个样本(60Hz)。 因此,我尝试使用 NDK 通过 NativeActivity 访问传感器,方法是生成我尝试基于 sensor.h 和 looper.h 制作的 .c 文件:
#include <jni.h>
#include <string.h>
#include <android/sensor.h>
#include <android/log.h>
#include <android/looper.h>
#define TAG "accelerondk"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define LOOPER_ID 1
#define SAMP_PER_SEC 100 //i've changed to 120, even 10, but nothing happen
void Java_azka_web_ndk_AcceleroNDKActivity_startMonitoring(JNIEnv* env, jclass clazz) {
ASensorManager* sensorManager = ASensorManager_getInstance();
ALooper* looper = ALooper_forThread();
if(looper == NULL)
looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
ASensorRef accelerometerSensor = ASensorManager_getDefaultSensor(sensorManager,ASENSOR_TYPE_ACCELEROMETER);
LOGI("accelerometerSensor: %s, vendor: %s", ASensor_getName(accelerometerSensor), ASensor_getVendor(accelerometerSensor));
ASensorEventQueue* queue = ASensorManager_createEventQueue(sensorManager, looper, LOOPER_ID, NULL, NULL);
ASensorEventQueue_enableSensor(queue, accelerometerSensor);
ASensorEventQueue_setEventRate(queue, accelerometerSensor, (1000L/SAMP_PER_SEC)*1000);
int ident;//identifier
int events;
while (1) {
while ((ident=ALooper_pollAll(-1, NULL, &events, NULL) >= 0)) {
// If a sensor has data, process it now.
if (ident == LOOPER_ID) {
ASensorEvent event;
while (ASensorEventQueue_getEvents(queue, &event, 1) > 0) {
LOGI("aaaaaaa accelerometer X = %f y = %f z=%f ", event.acceleration.x, event.acceleration.y, event.acceleration.z);
}
}
}
}
}
到目前为止,我已经能够使用 NativeActivity 访问加速度计,但是采样的数量没有变化。即使我将 ASensorEventQueue_setEventRate 更改得足够大或足够小,加速度记录仍然约为每秒 60 个样本(每 15 毫秒 1 个样本)
我的代码有错误吗?还是我忘记的东西?
提前致谢
【问题讨论】:
-
这个问题你解决了吗?
标签: android android-ndk native accelerometer sensors