比方說,很多功能是使用從該類test.MyClass
方法,但它的速度很慢,我想在JNI編寫改善的時機,希望...有沒有辦法替代庫類?
有沒有辦法來取代test.MyClass
所以庫不需要改變,但是從現在開始,庫中的代碼將使用新的test.MyClass
以及某些方法的本地實現?這是經典的「PC很好,但Android的時機就是廢話」問題。
比方說,很多功能是使用從該類test.MyClass
方法,但它的速度很慢,我想在JNI編寫改善的時機,希望...有沒有辦法替代庫類?
有沒有辦法來取代test.MyClass
所以庫不需要改變,但是從現在開始,庫中的代碼將使用新的test.MyClass
以及某些方法的本地實現?這是經典的「PC很好,但Android的時機就是廢話」問題。
只需創建與您要覆蓋的包中相同的包/層次結構中的test.MyClass
。 classloader
應該首先加載你的實現,如果它試圖加載其他庫中的加載,那麼加載將失敗,因爲在類路徑中只能有一個加載的實例。
並不總是那麼簡單。當確定兩個類是否在同一個包中時,VM會考慮對{package_name,classloader}。不同的類加載器意味着虛擬機將它們視爲具有相同名稱的獨立類,因此兩者都將被加載。如果你試圖替換java.lang.String,你最終會得到兩個不相互交互的String類,當你試圖將一個「應用程序字符串」傳遞給核心類中的某個東西時,這是一個問題或相反亦然。 (有一些時髦的邊緣案例...我不建議這樣做。) – fadden
示例:https://android.googlesource.com/platform/dalvik/+/kitkat-mr2-release/tests/068-classloader/ – fadden
在大多數情況下,JNI並沒有改善計時。它甚至可能使情況更糟,因爲調用本地方法會帶來一些開銷。你確定它不是經典的「我的算法很糟糕,但它在個人電腦上不可見,因爲它們有更多的處理能力」問題? – zapl