美文网首页
GetObjectField 拿基础字段异常问题

GetObjectField 拿基础字段异常问题

作者: wizdzz | 来源:发表于2019-02-01 17:52 被阅读0次

    要在 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 就好了。

    相关文章

      网友评论

          本文标题:GetObjectField 拿基础字段异常问题

          本文链接:https://www.haomeiwen.com/subject/rnvdsqtx.html