2009-07-16 6 views
2

私はAndroidでc-jni関数を書いていますが、ロングオブジェクトの作成に問題があります。私はコンストラクタを呼び出すことに成功しましたが、longValueでオブジェクトの値を読み取ると、間違った結果になります。JNI:間違った値で作成されたロングオブジェクト

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が書き込まれていない理由についてのアイデアを持っていますログ?

答えて

1

JNIマッピングの種類を見れば、Cの長い部分はjintと同等です。したがって、java/lang/Longではなくjava/lang/Integerを使用する必要があります。

// 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中>

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

おかげで、。ちょうどjlong​​が動作するように4242をキャスト – Dan

+0

@ダン:これはあなたの側に、おそらくC + +ので​​すか? –

関連する問題