Tôi đã viết một đoạn mã trong c để tính toán thời gian một phần của mã C đang thực hiện, sau đó cố gắng báo cáo lại mã Java. Nhưng vấn đề là sự khác biệt về thời gian luôn luôn trở lại bằng không. đây là bản gốc CBộ đếm thời gian NDK của 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);
}
Khi tôi chạy nó, tôi luôn nhận được "theo difftime(), ngủ cho -0.00000000 giây". Bất kỳ ý tưởng gì là sai?
-------------------------------- Giải pháp mã cuối cùng --------- -----------------------------------------------
Đây là những gì tôi tìm thấy cuối cùng công trình không chắc chắn lý do tại sao như tôi không phải là một guru C nhưng ở đây nó là anyway.
mã Java#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);
}
cho vẻ android như thế này:
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();
}
}
Chúng tôi chỉ xử lý câu hỏi sử dụng ở đây, câu hỏi dev đi trên [SO]. –