2009-07-16 5 views
2

J'écris une fonction c-jni dans Android, et j'ai des problèmes avec la création d'un objet long. J'ai réussi à appeler le constructeur, mais quand je lis la valeur de l'objet avec longValue, j'obtiens le mauvais résultat.JNI: Long-objet créé avec une valeur erronée

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); 

j'attendre à ce que le code ci-dessus imprimera 4242 dans le journal, mais la valeur qui est imprimée dans le journal est 1691768.

Est-ce que quelqu'un a une idée sur la raison pour laquelle 4242 est pas écrit dans le bûche?

Répondre

1

Si vous regardez les types de mapping JNI, long en C est équivalent à jint donc je pense que vous devriez utiliser java/lang/Integer au lieu de 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); 
3

< jni.h> déclare

typedef long long  jlong;   /* signed 64 bits */ 

Par conséquent, voici la solution:

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); 
+0

Merci, ça marche pour moi. Il suffit de lancer le 4242 pour que jlong ​​fonctionne – Dan

+0

@Dan: c'est probablement du C++ de votre côté, non? –

Questions connexes