java - studio - Temporizadores Android NDK
temporizador en java (4)
Intente usar gettimeofday()
para medir el tiempo. Lo utilicé con éxito con el NDK, aunque en mi caso fue con pthread_cond_timedwait()
.
Escribí un fragmento de código en c para calcular cuánto tiempo tardaba una sección del código C, y luego intenté informarlo al código Java. Pero el problema es que el diferencial del temporizador siempre regresa como cero. aquí está el nativo 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);
}
Cuando ejecuto esto siempre obtengo "de acuerdo con difftime (), dormí durante -0.00000000 segundos". Alguna idea de lo que está mal?
-------------------------------- Solución de código final --------------- -----------------------------------------
Esto es lo que encontré, finalmente funciona, no estoy seguro de por qué, ya que no soy un gurú de C, pero aquí está de todos modos.
#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);
}
El código de Java para Android se ve así:
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();
}
}
Use gettimeofday () de esta manera:
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;
}
Ver esta referencia 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;
}
Verifique el código de retorno de sleep () para asegurarse de que se devuelve 0, lo que significa que los 5 segundos han expirado. Quizás la implementación de la libra biónica del sueño no esté funcionando correctamente en su entorno (emulador / dispositivo). O intente aumentar el número de segundos para dormir a 60 y agregue algunas instrucciones de impresión antes y después para asegurarse de que el minuto se duerma.