2016-01-08 85 views
1

雖然也有類似的問題(如thisthis),但他們的回答並不能解決我的問題。我正在使用Android Studio 1.5.1,目標是Android API 18(在Android KitKat 4.4之前,所以我正在處理Dalvik,而不是ART運行時)。如何使用Java反射調用Android Dalvik內部方法?

我的問題是:

(1)是否有可能使用反射來調用的Dalvik內部的方法呢?如果是這樣,你能展示一個代碼示例嗎?例如,Dalvik有自己的位於源代碼here (Interpreter)的棧,我可以通過反射調用函數dvmDumpRunningThreadStack()嗎? (2)如果(1)是不可能的,因爲堆棧是用本地代碼寫的,是否有可能調用任何 Dalvik內部方法使用反射嗎?(012)。如果是這樣,你能展示一個代碼示例嗎?例如,Dalvik有很多位於源代碼here (Dalvik)的方法,我可以通過反射調用任何方法嗎?

+0

我認爲不可能。基於你的問題,我期待看看它將如何在Java JVM中完成,並發現這篇文章/博客文章:http://blog.takipi.com/using-reflection-to-look-inside-the-jvm-並且認爲關鍵句子是:'通過一系列C++宏和許多艱苦的工作,HotSpot團隊手動將幾十個內部C++類的字段結構映射並加載到全局gHotSpotVMStructs中。這個過程使他們可以從外面反思。「我在達爾維克沒有找到類似的結構,但我可能弄錯了。 –

回答

0

這不起作用。反射機制只知道如何找到對Java語言代碼可見的東西。

您可以調用託管代碼可見但不屬於公共API的方法。虛擬機的內部原生函數不可見,並且沒有虛擬機功能來查找它們。所有打算調用的VM函數都會在類中明確地發佈爲「本地」方法。

0

首先,Java中的反射只能得到一個java級別的函數指針。其實質是從相應的類對象中獲取vtable。 所有的達爾維克內部方法都位於'/ system/lib /'。而你的代碼位於'/ data/app /'。

所以,我不認爲你可以在運行時使用任何dalvik內部方法,除非你知道libdvm.so的地址和動態庫(例如libdvm.so)中內部方法的偏移量。

如果您的手機在您生成的ROM上運行,請使用objdump -D libdvm.so獲取偏移量並打印日誌以查找libdvm.so的地址。 我認爲這可能是工作。

:)