我在c中写了一段代码来计算C代码的一段时间,然后尝试将其回报给
Java代码.但是问题是定时器差动总是回到0.这里是本地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,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(); } }
解决方法
尝试使用gettimeofday()来衡量时间.我已经成功地使用它与NDK,虽然在我的情况下它是与pthread_cond_timedwait().