-
-
[求助]修改smali文件,使程序加载第三方库,总提示UnsatisfiedLinkError?
-
发表于:
2014-4-24 15:45
14580
-
[求助]修改smali文件,使程序加载第三方库,总提示UnsatisfiedLinkError?
已知:
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 | .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直播授课