2011-08-23 20 views
10

Ho scritto un pezzo di codice in c per calcolare la lunghezza di una sezione del codice C, quindi provare a riportarlo al codice Java. Ma il problema è che il differenziale del timer ritorna sempre come zero. ecco la C nativoTimer NDK Android

#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); 
} 

Quando eseguo questo ottengo sempre "secondo difftime(), dormì per -0.00000000 secondi". Qualche idea, cosa c'è che non va?

-------------------------------- Soluzione codice finale --------- -----------------------------------------------

Questo è quello che ho trovato, finalmente funziona, non so perché, perché non sono un guru del C ma qui lo è comunque.

#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); 
} 

codice Java per gli sguardi Android, come questo:

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(); 
    } 
} 
+1

Trattiamo soltanto le domande di utilizzo qui, domande dev andare avanti [SO]. –

risposta

7

Provare a utilizzare gettimeofday() per misurare il tempo. L'ho usato con successo con NDK, anche se nel mio caso era con pthread_cond_timedwait().

2

Vedi questo riferimento. 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

Ho già eseguito questa versione del codice utilizzando i timer e ho ancora 0 secondi. Questo è il motivo per cui ho seguito un percorso diverso con il codice sopra. Deve essere qualcosa con le chiamate native e l'orologio di sistema. – JPM

+0

Hai provato a usare Java per misurare il tempo? – Frohnzie

0

Controllare il codice di ritorno per il sonno() per garantire che viene restituito 0, vale a dire i 5 secondi sono scaduti. Forse l'implementazione della libic bionic di sleep non funziona correttamente nel tuo ambiente (emulatore/dispositivo). Oppure prova ad aumentare il numero di secondi in cui dormire fino a 60 e aggiungi alcune dichiarazioni di stampa prima e dopo per assicurarti che il minuto si verifichi.

2

Usa gettimeofday() in questo modo:

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; 
}