首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNI: Long-使用错误的值创建的对象

JNI: Long-使用错误的值创建的对象
EN

Stack Overflow用户
提问于 2009-07-16 15:03:41
回答 2查看 4.2K关注 0票数 2

我正在用Android编写一个c-jni函数,我在创建一个长对象时遇到了问题。我已经成功地调用了构造函数,但是当我使用longValue读取对象的值时,我得到了错误的结果。

代码语言:javascript
复制
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吗?

EN

回答 2

Stack Overflow用户

发布于 2014-02-23 19:03:18

声明

代码语言:javascript
复制
typedef long long       jlong;          /* signed 64 bits */

因此,修复方法如下:

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2009-12-21 01:46:39

如果你看看JNI映射类型,在C中的long等同于jint,因此我认为你应该使用java/lang/Integer而不是java/lang/Long。

代码语言:javascript
复制
// 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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1138273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档