使用ApplicationContext在smali文件中调用方法

时间:2018-10-20 09:42:45

标签: applicationcontext smali

我想使用p0 ApplicationContext:Landroid / content / Context调用一个方法。 如何获得该类的ApplicationContext?

我尝试从类的init方法调用我的方法以复制p0,但android无法以此验证类。

有什么想法吗?如果需要,我将提供更多详细信息。

@JesusFreke:更多信息

1次编辑崩溃

10-06 15:43:48.081 14308 14557 E AndroidRuntime: FATAL EXCEPTION: WFSync
10-06 15:43:48.081 14308 14557 E AndroidRuntime: Process: com.zynga.words3, PID: 14308
10-06 15:43:48.081 14308 14557 E AndroidRuntime: java.lang.VerifyError: Verifier rejected class com.zynga.wfframework.appmodel.game.GameCenter$6: void com.zynga.wfframework.appmodel.game.GameCenter$6.<init>(com.zynga.wfframework.appmodel.game.GameCenter, android.content.Context, com.zynga.wfframework.appmodel.AppModelCallback, java.util.Date, long, java.util.Date, long, com.zynga.wfframework.remoteservice.IRemoteService$PollType, com.zynga.wfframework.appmodel.sync.SyncService$SyncServicePollType, android.content.Intent, int) failed to verify: void com.zynga.wfframework.appmodel.game.GameCenter$6.<init>(com.zynga.wfframework.appmodel.game.GameCenter, android.content.Context, com.zynga.wfframework.appmodel.AppModelCallback, java.util.Date, long, java.util.Date, long, com.zynga.wfframework.remoteservice.IRemoteService$PollType, com.zynga.wfframework.appmodel.sync.SyncService$SyncServicePollType, android.content.Intent, int): 
[0x41] 'this' arg must be initialized 
(declaration of 'com.zynga.wfframework.appmodel.game.GameCenter$6' appears in /data/app/com.zynga.words3-2/base.apk:classes3.dex)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at com.zynga.wfframework.appmodel.game.GameCenter.refreshState(SourceFile:1201)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at com.zynga.wfframework.appmodel.game.GameCenter.refreshState(SourceFile:1144)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at com.zynga.wfframework.appmodel.sync.SyncService$1.run(SourceFile:189)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at java.lang.Thread.run(Thread.java:761)

2部分代码

.method constructor <init>(Lcom/zynga/wfframework/appmodel/game/GameCenter;Landroid/content/Context;Lcom/zynga/wfframework/appmodel/AppModelCallback;Ljava/util/Date;JLjava/util/Date;JLcom/zynga/wfframework/remoteservice/IRemoteService$PollType;Lcom/zynga/wfframework/appmodel/sync/SyncService$SyncServicePollType;Landroid/content/Intent;I)V
    .registers 16

    ...

    #@41
    #v0=(Reference,Lcom/zynga/wfframework/remoteservice/RemoteServiceSyncResult;);v1=(Null);p0=(UninitThis,Lcom/zynga/wfframework/appmodel/game/GameCenter$6;);
    invoke-virtual {p0, v1, v0}, Lcom/zynga/wfframework/appmodel/game/GameCenter$6;->onPostExecute(ILcom/zynga/wfframework/remoteservice/RemoteServiceSyncResult;)V

为什么不初始化p0?我该怎么做才能将其初始化? 希望能对您有所帮助。顺便说一句,我以另一种方式解决了问题,但这取决于所调用类中的错误方法。我希望找到其他解决方案。

1 个答案:

答案 0 :(得分:0)

在构造函数中,this参数(p0)以未初始化的形式开始,并且只有在初始化之前才能使用。您必须调用超类的<init>方法来对其进行初始化。

例如如果超类为Lcom/some/superclass;,并且具有无参数构造函数,则需要添加

invoke-direct {p0}, Lcom/some/superclass;-><init>()V

在尝试使用p0之前的某个时候。

假设您首先要使用一种工作方法,那么构造函数应该已经有这样一条指令。在这种情况下,您只需要在其后移动方法调用即可。