gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:26:10 25 4
gpt4 key购买 nike

由于从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com