Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

找不到getSharedPreferences #45

Open
svengong opened this issue Aug 10, 2019 · 5 comments
Open

找不到getSharedPreferences #45

svengong opened this issue Aug 10, 2019 · 5 comments

Comments

@svengong
Copy link

QQ截图20190810202643
QQ截图20190810202840
如图,看上去Application里找不到getSharedPreferences这个方法。目前Application里调试看到只有getPackageManager和getPackageInfo。在哪里加上请指教

@svengong
Copy link
Author

基本知道原因了,查找method时是Context
GetMethodID class=android/content/Context, methodName=getSharedPreferences,
而后面调用的时候是Application
CallObjectMethodV dvmObject=DvmObject{value=android/app/ActivityThread->currentApplication()Landroid/app/Application;},objType=android/app/Application, dvmClass=android/app/Application, jmethodID=unicorn@0xa0a12d1f

两者是继承关系,context是接口,application是实现,这就很尴尬,后面我想想怎么改比较合理吧

@svengong
Copy link
Author

希望作者关注下这类问题,好多接口都会这样

@zhkl0228
Copy link
Owner

反馈问题请发上测试代码

@svengong
Copy link
Author

      Pointer _CallObjectMethodV = svcMemory.registerSvc(new ArmSvc() {
            @Override
            public long handle(Emulator emulator) {
                UnicornPointer object = UnicornPointer.register(emulator, ArmConst.UC_ARM_REG_R1);
                UnicornPointer jmethodID = UnicornPointer.register(emulator, ArmConst.UC_ARM_REG_R2);
                UnicornPointer va_list = UnicornPointer.register(emulator, ArmConst.UC_ARM_REG_R3);
                if (log.isDebugEnabled()) {
                    log.debug("CallObjectMethodV object=" + object + ", jmethodID=" + jmethodID + ", va_list=" + va_list + ", lr=" + UnicornPointer.register(emulator, ArmConst.UC_ARM_REG_LR));
                }
                DvmObject dvmObject = getObject(object.peer);
                DvmClass dvmClass = dvmObject == null ? null : dvmObject.objectType;

                DvmMethod dvmMethod = dvmClass == null ? null : dvmClass.methodMap.get(jmethodID.peer);
                if (dvmMethod == null) {
                    if (dvmClass.toString().equals("android/app/Application")) {
                        dvmClass = findClass("android/content/Context");
                    }
                    dvmMethod = dvmClass == null ? null : dvmClass.methodMap.get(jmethodID.peer);
                    if (dvmMethod == null) {
                        throw new UnicornException("dvmObject=" + dvmObject + ",objType=" + dvmObject.objectType + ", dvmClass=" + dvmClass + ", jmethodID=" + jmethodID);
                    }
                    return addObject(dvmMethod.callObjectMethodV(dvmObject, new VaList(DalvikVM.this, va_list)), false);

                } else {
                    return addObject(dvmMethod.callObjectMethodV(dvmObject, new VaList(DalvikVM.this, va_list)), false);
                }
            }
        });

做了一个简单的兼容,没有抽象

@svengong
Copy link
Author

测试代码要整理一下,因为上面的改法可以跑通了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants