上层的Java代码:
package com.example.hellojni; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class HelloJni extends Activity{ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { String str = stringFromJNI(); btn.setText(str); }}); } public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello-jnis"); } } 我们看到native层的字符串是:Hello from JNI !,那么我们现在来修改这个字符串内容。这时候我们就需要用到上面说到的那个强大的工具:IDA了,打开so文件,很简单的,界面如下:
这里有很多窗口的,所以IDA工具很强大,我们需要慢慢的学习,还有各种快捷键的使用,都是一门学问。
在Functions window窗口中我们可以看到我们的native函数,如果太多的话,我们可以用Ctrl+F搜索。然后我们双击这个函数,在IDA View窗口中就可以看到这个函数的汇编代码了:
关于汇编指令,这里也不多解释了,大学里面都学过了,但是可能都忘了,所以还得复习一下。这里我们看到了,那个字符串的地址:aHelloFromJni - 0xBF4,0xBF4是偏移地址,这个aHelloFromJni应该是一个符号,所以我们双击跳到这个字符串的绝对地址。
这里又要在做一个插曲了,就是在详细介绍一下elf文件中的各个段的信息:
我们在IDA中可以使用Shift+F7快捷键打开段窗口: