Calling Functions
Calling Functions
Call native function from Module
1// By offset (hex address within SO)
2Number result = module.callFunction(emulator, 0x7e0);
3
4// By exported symbol name
5Number result = module.callFunction(emulator, "_Z4testv");
6Number result = module.callFunction(emulator, "Java_com_example_MyClass_nativeMethod");
7
8// With arguments (long/int/pointer)
9Number result = module.callFunction(emulator, 0x1000, arg1, arg2, arg3);
Arguments are passed as long values. Pointers should be cast to long.
Call via Emulator directly
1// eFunc: call by absolute address
2Number result = emulator.eFunc(functionAddress, arg1, arg2, arg3);
Call Java static methods (DVM)
1// Returns primitive (int, long, etc.)
2Number result = dvmClass.callStaticJniMethod(emulator,
3 "methodName(I)I", // JNI signature
4 42); // args
5
6// Returns object
7DvmObject<?> obj = dvmClass.callStaticJniMethodObject(emulator,
8 "methodName(Ljava/lang/String;)[B",
9 new StringObject(vm, "input"));
Call Java instance methods (DVM)
1// Create instance
2DvmObject<?> instance = dvmClass.newObject(null);
3
4// Call method on instance
5Number result = instance.callJniMethod(emulator, "method(I)V", 42);
6DvmObject<?> obj = instance.callJniMethodObject(emulator, "method()Ljava/lang/String;");
JNI Signature Reference
| Java type | JNI descriptor |
|---|---|
int | I |
long | J |
boolean | Z |
byte | B |
byte[] | [B |
String | Ljava/lang/String; |
void | V |
Format: methodName(param_descriptors)return_descriptor
Reading return values
1Number result = ...;
2int intVal = result.intValue();
3long longVal = result.longValue();
Key classes
| Class | Path |
|---|---|
Module | unidbg-api/.../Module.java |
DvmClass | unidbg-android/.../dvm/DvmClass.java |
DvmObject | unidbg-android/.../dvm/DvmObject.java |
StringObject | unidbg-android/.../dvm/StringObject.java |