我正在用Android编写一个c-jni函数,我在创建一个长对象时遇到了问题。我已经成功地调用了构造函数,但是当我使用longValue读取对象的值时,我得到了错误的结果。
jmethodID longConstructor;
jmethodID longGetLongValue;
jclass cls;
jobject obj;
// Create a object of type Long.
cls = (*env)->FindClass(env,"java/lang/Long");
longConstructor = (*env)->GetMethodID(env,cls,"<init>","(J)V");
obj = (*env)->NewObject(env, cls, longConstructor, 4242);
// Get the value by calling the function longValue.
longGetLongValue= (*env)->GetMethodID(env,cls,"longValue","()J");
long return_long_value = (*env)->CallLongMethod(env, obj, longGetLongValue);
// Log the result.
LOGD("%li", return_long_value); 我期望上面的代码在日志中打印4242,但是在日志中打印的值是1691768。
有人知道为什么日志中没有记录4242吗?
发布于 2014-02-23 19:03:18
声明
typedef long long jlong; /* signed 64 bits */因此,修复方法如下:
obj = (*env)->NewObject(env, cls, longConstructor, (jlong)4242); // or 4242ll
longGetLongValue= (*env)->GetMethodID(env,cls,"longValue","()J");
long return_long_value = (*env)->CallLongMethod(env, obj, longGetLongValue);
jlong return_jlong_value = (*env)->CallLongMethod(env, obj, longGetLongValue);
__android_log_print(ANDROID_LOG_DEBUG, "test", "native t = %ld", return_long_value);
__android_log_print(ANDROID_LOG_DEBUG, "test", "native t = %lld", return_jlong_value);发布于 2009-12-21 01:46:39
如果你看看JNI映射类型,在C中的long等同于jint,因此我认为你应该使用java/lang/Integer而不是java/lang/Long。
// Create a object of type Integer
jclass cls = (*env)->FindClass(env, "java/lang/Integer");
jmethodID constructorId = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
jobject o = (*env)->NewObject(env, cls, constructorId, 4242);
// Get the value by calling the function intValue.
jmethodID intValueMethodId = (*env)->GetMethodID(env, cls, "intValue", "()I");
long val = (*env)->CallIntMethod(env, obj, intValueMethodId);
// Log the result.
LOGD("%d", val);https://stackoverflow.com/questions/1138273
复制相似问题