Таймеры Android NDK - PullRequest
       20

Таймеры Android NDK

10 голосов
/ 23 августа 2011

Я написал фрагмент кода на c, чтобы вычислить, сколько времени занимает часть кода C, а затем попытался сообщить об этом обратно в код Java.Но проблема в том, что дифференциал таймера всегда возвращается как ноль.вот родной C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* sleep() */
#include <time.h>
#include <jni.h>

jstring Java_com_nsf_ndkfoo_NDKFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {

    time_t start, end;

    start = time(NULL);
    if(start == (time_t)-1) {
      return 1;
    }

    sleep(5);

    end = time(NULL);

    char buf[60] = { 0 };

    sprintf(buf,"according to difftime(), slept for %.8f seconds\n", (int)difftime(end, start));

    return (*env)->NewStringUTF(env, buf);
}

Когда я запускаю это, я всегда получаю "в соответствии с difftime (), спал в течение -0,00000000 секунд".Есть идеи, что не так?

-------------------------------- Окончательное решение кода --------------------------------------------------------

Это то, что я нашел, наконец работает, не уверен, почему, поскольку я не гуру C, но здесь это все равно.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* sleep() */
#include <sys/time.h>
#include <jni.h>

jstring Java_com_nsf_ndkfoo_NDKFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {

    struct timeval start;
    struct timeval end;

    gettimeofday(&start, NULL);
    sleep(5);

    gettimeofday(&end, NULL);

    char buf[60] = { 0 };

    sprintf(buf,"according to difftime(), slept for %ld seconds\n",  ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)));

    return (*env)->NewStringUTF(env, buf);
}

Java-код для Androidвыглядит так:

package com.nsf.ndkfoo;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;

public class NDKFooActivity extends Activity {
    // load the library - name matches jni/Android.mk
    static {
        System.loadLibrary("ndkfoo");
    }

    // declare the native code function - must match ndkfoo.c
    private native String invokeNativeFunction();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // this is where we call the native code
        String hello = invokeNativeFunction();

        new AlertDialog.Builder(this).setMessage(hello).show();
    }
}

Ответы [ 4 ]

7 голосов
/ 24 августа 2011

Попробуйте использовать gettimeofday() для измерения времени. Я успешно использовал его с NDK, хотя в моем случае это было с pthread_cond_timedwait().

2 голосов
/ 31 января 2012

Используйте gettimeofday () следующим образом:

bool QueryPerformanceCounter( int64_t* performance_count )
{
    struct timeval Time;

    /* Grab the current time. */
    gettimeofday( &Time, NULL );
    *performance_count = Time.tv_usec + /* Microseconds. */
                         Time.tv_sec * usec_per_sec; /* Seconds. */

    return true;
}
2 голосов
/ 23 августа 2011

См. Эту ссылку. http://www.cplusplus.com/reference/clibrary/ctime/difftime/

/* difftime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t start,end;
  char szInput [256];
  double dif;

  time (&start);
  printf ("Please, enter your name: ");
  gets (szInput);
  time (&end);
  dif = difftime (end,start);
  printf ("Hi %s.\n", szInput);
  printf ("It took you %.2lf seconds to type your name.\n", dif );

  return 0;
}
0 голосов
/ 24 августа 2011

Проверьте код возврата для sleep (), чтобы убедиться, что возвращается 0, то есть истекли 5 секунд. Может быть, реализация сна в bionic libc не работает должным образом в вашей среде (эмулятор / устройство). Или попробуйте увеличить количество секунд для перехода в спящий режим до 60 и добавить несколько операторов печати до и после, чтобы убедиться, что минута находится в режиме ожидания.

...