2017-06-07 30 views
0

我無法找到有關JNI如何適用於Android詳細的詳細說明任何引用下,所以:Android的JNI引擎蓋

  1. 由於每個Android應用程序在自己的進程中運行,用自己的實例Dalvik/ART虛擬機,我認爲本機代碼將在相同的過程中執行,對嗎?

  2. 我讀到,當VM調用一個函數時,它傳遞一個JNIEnv指針,jobject指針以及由Java方法聲明的任何Java參數。 但是,這是如何在組裝層面(引擎蓋下)?

  3. 我讀過,你可以使用JNIEnv提供的函數實例化對象,調用方法等,像Reflection。因此,我的問題是:我有直接的內存訪問虛擬機還是一直使用JNIEnv的功能?

+0

問題1是會得到這個問題的封閉,題外話,所以我建議將其刪除,並留下剩餘的3 – samgak

+0

不是重複,而是密切相關:https://開頭計算器。com/questions/24746776/what-does-a-jvm-have-to-do-calling-a-native-method –

+0

@AlexCohn謝謝,它離我們更近了一步 –

回答

1

Android JVM由Apache授權,所以最好的詳細和準確的描述可以源代碼的形式找到。請注意,有兩個不同的JVM:dalvikart。在引擎蓋下它們是非常不同的,JNI的用戶可能會考慮特殊的改編。

  1. 本地代碼將在相同的工藝

    恰好被執行。請注意,Android應用程序可以在多個進程中運行,也可以產生子進程(正常的Unix行爲)。但JNI不是IPC。

  2. 這是如何在組裝級別?

    或多或少,這在相關 問題描述:What does a JVM have to do when calling a native method?

  3. 有我 「直接」 內存訪問VM?

    是的,你有。您的C代碼和JVM之間沒有安全屏障。您可以對數據結構進行反向工程,然後執行您喜歡的任何操作。 JVM的確切實現不僅取決於Android版本,而且只要JVM的公共API(包括JNI)是兼容的,就可以在供應商沒有通知的情況下進行修改。你可以通過直接內存訪問JVM來做一些有用的事情,但它很有可能會崩潰。

    請注意,這不是一個安全問題:您的C代碼在單獨的進程(使用您的Java代碼)中運行,並且受到與Java代碼相同的權限限制。它無法訪問其他應用程序或procsses的私人內存。無論您在JVM實例中如何更改,都不會影響運行其他應用程序的虛擬機。