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

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

2014-4-24 15:45
14486
已知:
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文件。我修改了三处:

# 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


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


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


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

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
....

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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (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
游客
登录 | 注册 方可回帖
返回
//