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 typeJNI descriptor
intI
longJ
booleanZ
byteB
byte[][B
StringLjava/lang/String;
voidV

Format: methodName(param_descriptors)return_descriptor

Reading return values

1Number result = ...;
2int intVal = result.intValue();
3long longVal = result.longValue();

Key classes

ClassPath
Moduleunidbg-api/.../Module.java
DvmClassunidbg-android/.../dvm/DvmClass.java
DvmObjectunidbg-android/.../dvm/DvmObject.java
StringObjectunidbg-android/.../dvm/StringObject.java