已知:
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
....
求各位大大帮忙解决下。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!