要在 native 里面拿 java 實(shí)例的字段,代碼這樣寫乍看沒(méi)什么問(wèn)題男旗;
jobject getFieldValue(JNIEnv *env, const char *fieldName, const char *sig, jobject obj){
jclass clazz = env->GetObjectClass(obj);
jfieldID field = env->GetFieldID(clazz, fieldName, sig);
return env->GetObjectField(obj, field);
}
...
jstring mac = (jstring)getFieldValue(env, "mac", "Ljava/lang/String;", platformInfo);
int year = (int)getFieldValue(env, "year", "I", platformInfo);
然而跑起來(lái)你會(huì)發(fā)現(xiàn) String 可以拿到舶斧,而拿 int 的時(shí)候卻崩潰了,起初我以為又是 java 把 int 強(qiáng)轉(zhuǎn)為 Integer 了察皇,于是把字段簽名改成 "Ljava/lang/Integer;"茴厉,但是發(fā)現(xiàn)這樣連 field 都拿不到了;
日志也看的人迷糊什荣,只是簡(jiǎn)單的給出了崩潰時(shí)候的寄存器值和當(dāng)時(shí)的一些內(nèi)存數(shù)據(jù)矾缓;
狠下心來(lái)去看源碼,想找關(guān)健位置來(lái) debug 框架代碼稻爬;
正好發(fā)現(xiàn)了這里:
下面赫然一個(gè) GetIntField嗜闻,噢,原來(lái)這些基礎(chǔ)類不能當(dāng)做 object 來(lái)拿桅锄,那么對(duì)于 int 只要把 GetObjectField 改成 GetIntField 就好了琉雳。