Android NDK定时器

我在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秒”。 任何想法有什么不对?

——————————– 最终代码解决scheme ————— —————————————–

这是我终于find的作品不知道为什么,因为我不是一个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); } 

Android的Java代码如下所示:

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

Solutions Collecting From Web of "Android NDK定时器"

尝试使用gettimeofday()来测量时间。 我已经成功地将它与NDK一起使用,但在我的情况下,它是与pthread_cond_timedwait()

看到这个参考。 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; } 

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

检查sleep()的返回码以确保返回0,即5秒过期。 也许在你的环境(模拟器/设备)中,仿生的libc实现睡眠不能正常工作。 或者尝试将睡眠秒数增加到60,并在前后添加一些打印语句以确保分钟睡眠发生。