首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SMALI帮助-从资源获取字符串

SMALI帮助-从资源获取字符串
EN

Stack Overflow用户
提问于 2021-04-01 06:18:57
回答 1查看 204关注 0票数 0

我用APKTool反编译了一个apk,在一个.smali文件中,我得到了这样的代码:

代码语言:javascript
复制
.class public Lc/c/a/a;
.super Ljava/lang/Object;
.source "SourceFile"

# instance fields
.field public a:Ljava/lang/String;

# direct methods
.method public constructor <init>()V
    .locals 1

    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    const-string v0, "Choose Storage"

    .line 2
    iput-object v0, p0, Lc/c/a/a;->a:Ljava/lang/String;

    return-void
.end method

我的问题是我需要从资源文件中获取"const-string,v0“。我尝试添加到字段中,递增本地变量

代码语言:javascript
复制
.field public l:Landroid/content/Context;

然后在"const-string v0“后面添加了下面的代码:

代码语言:javascript
复制
const v1, 0x7f1200a3

iget-object v0, p0, Lc/c/a/a;->l:Landroid/content/Context;

invoke-virtual {v0, v1}, Landroid/content/Context;->getString(I)Ljava/lang/String;

move-result-object v0

但应用程序在这一点上打开时会崩溃。

完全修改的代码

代码语言:javascript
复制
.class public Lc/c/a/a;
.super Ljava/lang/Object;
.source "SourceFile"

# instance fields
.field public a:Ljava/lang/String;

.field public l:Landroid/content/Context;

# direct methods
.method public constructor <init>()V
    .locals 2

    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    const-string v0, "Choose Storage"

    const v1, 0x7f1200a3

    iget-object v0, p0, Lc/c/a/a;->l:Landroid/content/Context;

    invoke-virtual {v0, v1}, Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    .line 2
    iput-object v0, p0, Lc/c/a/a;->a:Ljava/lang/String;

    return-void
.end method

来自LOGCAT的错误

代码语言:javascript
复制
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String andoid.content.Contect.getString(int)' on a null object reference
EN

回答 1

Stack Overflow用户

发布于 2021-07-20 22:46:13

因为l不是值,所以尝试使用上下文构造。

代码语言:javascript
复制
.class public Lc/c/a/a;
.super Ljava/lang/Object;
.source "SourceFile"

# instance fields
.field public a:Ljava/lang/String;

.field public l:Landroid/content/Context;

# direct methods
.method public constructor <init>(Landroid/content/Context;)V
    .locals 3

    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    
    #Assign value to l
    iput-object p1, p0, Lc/c/a/a;->l:Landroid/content/Context;
    
    const v0, 0x7f1200a3

    invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    iput-object v0, p0, Lc/c/a/a;->a:Ljava/lang/String;

    return-void
.end method

就像这样

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66896039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档