c++ - JNI 日期值转换问题,在 C++ 中获取不同的 long 值

标签 c++ date java-native-interface

由于从 Java 传递到 JNI/C++ 的(长)值非常不同,我在 jni 中陷入了一种基本的日期转换。 我的 Java 日期对象在类中初始化为,

Date date1=new Date(1220227200L * 1000);

// If I convert into milliseconds such as 
long timeInMillisecond=date1.getTime();
System.out.println (timeInMillisecond )
// it obviously displays 1220227200000

在我的原生函数中,我正在检索

jfieldID fid = env->GetFieldID(cls, "date1", "Ljava/util/Date");

// case 1 - value 1
jlong dobject =  (jlong) env->GetObjectField(object ,fid);
cout <<dobject;     //displays 139757766370904

// case 2 - value 2
long dobject2 = (long) env->GetObjectField(object, fid);
cout <<dobject2;  // displays 140031771862616

// case 3 - value 3
long long dobject3 = (long long) env->GetObjectField(object ,fid);
cout <<dobject3; //displays  140456034100824

我想知道在 C++ 中从 Java 获取正确值的最佳方法是什么。我正在使用 C++ 11。有人请在这里帮助我。

更新 抱歉,伙计们,我想我拼错了一些变量,所以它不是 GetObjectfield 中的 dobject2、3(更正)并且实际上重写了这里的代码以使其更清楚。

//Data.java
class Data {
  public long sDate;
  public Date schedDate;
  ....
}
// Test.java    
// Native function
public native static void sendEvent(Data EventRec);
Data Rec= new DataRec();
Rec.sDate= 1400754723399L;
Rec.schedDate = new Date(1220227200L * 1000);
sendEvent(Rec);
//C++
JNIEXPORT void JNICALL Java_Test_sendEvent  (JNIEnv *env, jclass cls, jobject jobj) {
    cls = env->FindClass("Data");
    if (cls !=NULL) {
        jmethodID ctorID = env->GetMethodID(cls, "<init>","()V");
        if (ctorID != NULL) {
            jfieldID fidLong = env->GetFieldID(cls, "sDate", "J");
            long dObj = (long) env->GetLongField(jobj,fidLong);
            cout << "C++ .. Event Date (LONG): " << dObj <<endl; // This is correct  
            jfieldID fidDate = env->GetFieldID(cls, "schedDate", "Ljava/util/Date");
            // Here is the problem area, that I tried to mimic above...             
            jobject dobject= (env->GetObjectField(jobj,fidDate));
            long dobj = env->GetLongField(dobject,fidDate);
            // OR 
            // long dObj2 = (long) env->GetLongField(jobj,fidDate);
            // ..... 
            cout << "C++ .. Date (DATE)..." << dobj;
        }
    }   
}

最佳答案

您的 JNI 代码没有正确访问 Java 对象。

在您的Java_Test_sendEvent() 实现中,jclass 参数指向您的public native static void sendEvent(Data EventRec); 在(你没有显示)中声明,jobject 参数指向你的 Java 代码传入的 Data Rec 对象到 sendEvent()

此外,在为 Date 字段调用 env->GetFieldID() 时,您在类型签名字符串末尾缺少一个必需的分号。

试试这个:

JNIEXPORT void JNICALL Java_Test_sendEvent  (JNIEnv *env, jclass cls, jobject EventRec)
{
    jclass cls_EventRec = env->GetObjectClass(EventRec);

    jfieldID fid_sDate = env->GetFieldID(cls_EventRec, "sDate", "J");
    if (!fid_sDate) {
        // error handling...
        return;
    }

    jfieldID fid_schedDate = env->GetFieldID(cls_EventRec, "schedDate", "Ljava/util/Date;");
    if (!fid_schedDate) {
        // error handling...
        return;
    }

    jlong sDate = env->GetLongField(EventRec, fid_sDate);
    cout << "C++ .. Event Date (LONG): " << sDate << endl;

    jobject schedDate = env->GetObjectField(EventRec, fid_schedDate);
    if (schedDate) {
        jclass cls_schedDate = env->GetObjectClass(schedDate);
        jmethodID mid_getTime = env->GetMethodID(cls_schedDate, "getTime", "()J"); 
        jlong timeInMillisecond = env->CallLongMethod(schedDate, mid_getTime);
        cout << "C++ .. Date (DATE)..." << timeInMillisecond << endl;
    }
}

关于c++ - JNI 日期值转换问题,在 C++ 中获取不同的 long 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59727627/

相关文章:

c++ - 如何使用 rangev3 范围实现平面图

C++17 排序 : post-increment on left side of assignment

c# - 如何在 DB 和 ORM 中为已知和未知日期部分的混合设计出生日期

c# - 统一使用 JNI AndroidJNI.GetMethodID 和字符串参数

c++ - 当在 QTableWidget 中拖动一行时,如何找出它被拖动的行索引 FROM 和 TO?

ios - 日期选择器显示与选择时不同的日期(晚 1 天)

php - 获取每天的总浏览量,包括没有记录的一天留下 "0 views"

java - 如果类存在于类中,则 JNI 函数名称

java - 从平台代码访问 android.provider.Settings.System 值

c++ - 提高从数组向链表插入元素的性能