package com.android.reverse.util;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.HashMap;
import org.jf.dexlib2.dexbacked.MemoryDexFileItemPointer;
import org.jf.dexlib2.dexbacked.MemoryReader;
import com.android.reverse.collecter.ModuleContext;
import com.android.reverse.smali.DexFileHeadersPointer;
public class NativeFunction implements MemoryReader {
private final static String DVMNATIVE_LIB = "dvmnative";
static{
System.loadLibrary(DVMNATIVE_LIB);
}
public static native ByteBuffer dumpDexFileByClass(Class classInDex,int version);
public static native ByteBuffer dumpDexFileByCookie(int cookie,int version);
public static native ByteBuffer dumpMemory(int start,int length);
private static native DexFileHeadersPointer getHeaderItemPtr(int cookie,int version);
public static native String getInlineOperation();
public static native HashMap getSyslinkSnapshot();
public byte[] readBytes(int arg0, int arg1) {
// TODO Auto-generated method stub
ByteBuffer data = dumpMemory(arg0, arg1);
data.order(ByteOrder.LITTLE_ENDIAN);
byte[] buffer = new byte[data.capacity()];
data.get(buffer, 0, data.capacity());
return buffer;
}
public static MemoryDexFileItemPointer queryDexFileItemPointer(int cookie){
int version = ModuleContext.getInstance().getApiLevel();
DexFileHeadersPointer iteminfo = getHeaderItemPtr(cookie,version);
MemoryDexFileItemPointer pointer = new MemoryDexFileItemPointer();
pointer.setBaseAddr(iteminfo.getBaseAddr());
pointer.setpClassDefs(iteminfo.getpClassDefs());
pointer.setpFieldIds(iteminfo.getpFieldIds());
pointer.setpMethodIds(iteminfo.getpMethodIds());
pointer.setpProtoIds(iteminfo.getpProtoIds());
pointer.setpStringIds(iteminfo.getpStringIds());
pointer.setpTypeIds(iteminfo.getpTypeIds());
pointer.setClassCount(iteminfo.getClassCount());
return pointer;
}
}