My task is to analyze method calls and corresponding native libraries of an android app by using ddmlib. I started with creating a simple app for testing purposes that uses jni for calling a function implemented in C (which squares a given number). Then I implemented IMethodProfilingHandler:
@Override
public void onSuccess(byte[] data, Client client) {
MethodCallExtractor extractor = MethodCallExtractor.GetInstance();
List calls = extractor.extract(data, client);
System.out.println("methodcalls:");
for(MethodCall call : calls){
System.out.println(call);
}
printNativeLibraries(client);
}
works and prints the call of the jni function. MethodCallExtractor is a simple parser that returns a List of MethodCalls. My problem is that
private void printNativeLibraries(Client client){
ClientData clientData = client.getClientData();
while(clientData.getNativeLibraryMapInfo().hasNext()){
System.out.println("library: " + clientData.getNativeLibraryMapInfo().next().getLibraryName());
}
}
does not print anything. Why is the library containing my C function (libsquared.so in my case) not listed in NativeLibraryMapInfo? What do I have to trigger to get NativeLibraryMapInfo initialized properly?
I spent hours experimenting with 'requestNativeHeapInformation()', 'requestAllocationDetails()', 'requestThreadUpdate()' and
'executeGarbageCollector()' without success and I cannot find any useful documentation about this issue.
I am using ddmlib-r13