要在 native 里面拿 java 实例的字段,代码这样写乍看没什么问题;
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);
然而跑起来你会发现 String 可以拿到,而拿 int 的时候却崩溃了,起初我以为又是 java 把 int 强转为 Integer 了,于是把字段签名改成 "Ljava/lang/Integer;",但是发现这样连 field 都拿不到了;
日志也看的人迷糊,只是简单的给出了崩溃时候的寄存器值和当时的一些内存数据;
狠下心来去看源码,想找关健位置来 debug 框架代码;
正好发现了这里:
下面赫然一个 GetIntField,噢,原来这些基础类不能当做 object 来拿,那么对于 int 只要把 GetObjectField 改成 GetIntField 就好了。
网友评论