首页
社区
课程
招聘
[求助]修改smali文件,使程序加载第三方库,总提示UnsatisfiedLinkError?
发表于: 2014-4-24 15:45 14580

[求助]修改smali文件,使程序加载第三方库,总提示UnsatisfiedLinkError?

2014-4-24 15:45
14580
已知:
SO文件:liblyz.so   
函数:JNIEXPORT jstring JNICALL Java_com_example_myso_NativeDemo_add
  (JNIEnv *env, jclass thiz){
        return (*env)->NewStringUTF(env, "[my name is lyz] from lyz.so!");
另一个工程useotherso:为了匹配SO中的函数名,我将包名设置成:com\example\myso
                类名:NativeDemo
目的:工程useotherso编译好之后,得到apk。然后解包 修改smali文件。达到在apk中调用add这个函数实现返回一个字符串。

我的步骤:
1.先通过另一个工程 得到了 SO文件,并且知道了 函数全称。
2.把这个工程中的SO文件保存下来。然后删除工程(新的工程和这个同名)
3.建一个新的工程。helloword。什么都不改。得到一个apk。
4.反编译得到smali文件。我修改了三处:

1
2
3
4
5
6
7
8
9
10
11
# direct methods
.method static constructor <clinit>()V
    .locals 1
 
    .prologue
    const-string v0, "lyz"
 
    invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
 
    return-void
.end method


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const/high16 v0, 0x7f03
 
    invoke-virtual {p0, v0}, Lcom/example/myso/NativeDemo;->setContentView(I)V
 
    invoke-virtual {p0}, Lcom/example/myso/NativeDemo;->add()Ljava/lang/String;
 
    move-result-object v0
 
    .local v0, reString:Ljava/lang/String;
    const/4 v2, 0x1
 
    invoke-static {p0, v0, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
 
    move-result-object v1
 
    .local v1, toast:Landroid/widget/Toast;
    invoke-virtual {v1}, Landroid/widget/Toast;->show()V
 
 
 
 
    .line 19
    if-nez p1, :cond_0


1
2
.method public native add()Ljava/lang/String;
.end method


修改之后。打包没问题。为了检查我是否修改成功,我把打包好之后,得到的apk进行处理,用jd-gui打开,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class NativeDemo extends Activity
{
  static
  {
    System.loadLibrary("lyz");
  }
 
  public native String add();
 
  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903040);
    String str = add();
    Toast.makeText(this, str, 1).show();


也能看出修改smali是成功了的。但是我在运行的时候 就提示说
Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/example/myso/NativeDemo;
Class init failed in newInstance call (Lcom/example/myso/NativeDemo;)
AndroidRuntime
java.lang.ExceptionInInitializerError
        at java.lang.Class.newInstanceImpl(Native Method)
--
--
--
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load lyz: findLibrary returned null
....

求各位大大帮忙解决下。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (7)
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
说是没找到你的so文件,你坚持下so存放的路径等等
2014-4-24 16:10
0
雪    币: 89
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
SO文件名称和load的名称不一样?
2014-4-24 16:52
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我把so是放在usesotest\myso\libs\armeabi下。smali文件夹是在usesotest\myso\smali目录下的。
2014-4-24 16:58
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
so文件名:liblyz.so
load的时候是直接load  “lyz”
2014-4-24 16:59
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我把so是放在usesotest\myso\libs\armeabi下。smali文件夹是在usesotest\myso\smali目录下的
2014-4-24 17:00
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
更新下,刚刚那个错误是因为:应该把so文件放在lib\armeabi目录下 。
2014-4-24 17:15
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bwn
8
,。。话说修改so函数导致找不到类的问题如何解决呢。
2017-2-27 13:47
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册