我正在尝试开发一个使用设备加速度计的Android应用程序。我想阅读加速度计的前五个事件并保存它们的加速度,之后再做一些事情。
我的JNI代码是:
ASensorEventQueue* sensorEventQueue;
ASensorManager* sensorManager;
vector<double> xx, yy, zz;
static int get_sensor_events(int fd, int events, void* data) {
ASensorEvent event;
while (ASensorEventQueue_getEvents(sensorEventQueue, &event, 1) > 0) {
//LOGI("accelerometer x = %f y = %f z=%f t=%lld", event.acceleration.x, event.acceleration.y, event.acceleration.z, event.timestamp);
xx.push_back(event.acceleration.x);
yy.push_back(event.acceleration.y);
zz.push_back(event.acceleration.z);
}
if (xx.size() > 5) {
ASensorManager_destroyEventQueue(sensorManager, sensorEventQueue);
return 0;
}
return 1;
}
extern "C" {
JNIEXPORT jint JNICALL
Java_com_example_sensor_MainActivity_senSor(JNIEnv *env,jclass clas,jobject activity) {
ASensorEvent event;
int events, ident;
ASensorRef accSensor;
LOGI("sensorValue() - ALooper_forThread()");
ALooper* looper;
looper = ALooper_forThread();
if(looper == NULL) looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
sensorManager = ASensorManager_getInstance();
accSensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER);
sensorEventQueue = ASensorManager_createEventQueue(sensorManager, looper, 1, get_sensor_events, NULL);
ASensorEventQueue_enableSensor(sensorEventQueue, accSensor);
//Sampling rate: 100Hz
int a = ASensor_getMinDelay(accSensor);
LOGI("min-delay: %d",a);
ASensorEventQueue_setEventRate(sensorEventQueue, accSensor, 0);
LOGI("sensorValue() - START");
//do some stuff of vectors
return 1;
}
}
问题是looper创建了一个后台线程。主线程首先终止,然后后台线程终止,但是我想在looper线程终止之后在主线程中做一些东西。