如何在JNI中同步?

时间:2015-05-12 09:54:38

标签: java android java-native-interface synchronization

我正在尝试开发一个使用设备加速度计的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线程终止之后在主线程中做一些东西。

0 个答案:

没有答案