我的任务是使用ddmlib分析方法调用和Android应用程序的相应本机库。我开始创建一个用于测试目的的简单应用程序,它使用jni来调用在C中实现的函数(对给定数字进行平方)。然后我实现了IMethodProfilingHandler:
@Override
public void onSuccess(byte[] data, Client client) {
MethodCallExtractor extractor = MethodCallExtractor.GetInstance();
List<MethodCall> calls = extractor.extract(data, client);
System.out.println("methodcalls:");
for(MethodCall call : calls){
System.out.println(call);
}
printNativeLibraries(client);
}
工作并打印jni函数的调用。 MethodCallExtractor是一个返回MethodCalls列表的简单解析器。我的问题是
private void printNativeLibraries(Client client){
ClientData clientData = client.getClientData();
while(clientData.getNativeLibraryMapInfo().hasNext()){
System.out.println("library: " + clientData.getNativeLibraryMapInfo().next().getLibraryName());
}
}
不打印任何内容。为什么包含我的C函数的库(在我的情况下为libsquared.so)未在NativeLibraryMapInfo中列出?我需要触发什么才能正确初始化NativeLibraryMapInfo?
我花了几个小时试验'requestNativeHeapInformation()','requestAllocationDetails()','requestThreadUpdate()'和 'executeGarbageCollector()'没有成功,我找不到任何关于这个问题的有用文档。
我正在使用ddmlib-r13