多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
属性和函数ID可以在Native代码第一次访问到属性值或者第一次执行函数调用的时候.以下Java_InstanceFieldAccess_accessField函数实现使用静态变量缓存了属性ID,这样我们就不需要在每一次调用InstanceFieldAccess.accessField方法时候查找该属性ID. 以上代码中,高亮的静态变量fid_s保存着InstanceFieldAccess.s这属性的属性ID.这个静态变量使用NULL初始化,当InstanceFieldAccess.accessField第一次被调用的时候,fid_s被计算并缓存起来供之后使用. 可能你已经注意到上边代码中存在着明显的多线程竞争问题.多个线程可能并行调用InstanceFieldAccess.accessField函数并计算同样的属性ID,一个线程的计算结果可能会覆盖另一个线程的计算结果.虽然这会导重复的计算,对程序本身并没有严重伤害(不会引起崩溃),因为即使是通多线程,同一个类的同一个属性的属性ID是相同的. 同样的,我们可以缓存java.lang.String的构造方法ID在之前的MyNewString示例中. 我们在MyNewString第一次被调用的时候计算java.lang.String的构造函数函数ID, 并将其保存在以上代码中高亮的cid中.