天天看點

JNI之路徑初探---2

上一篇部落格寫的是Java調用C、C++的例子,本篇就示範一下C、C++怎麼調用Java的屬性和方法。

Java代碼中提供一個靜态方法給C、C++調用

C、C++代碼

一些具體的操作細節在第一篇部落格就寫的比較詳細了,這裡就不再重複了,值得一提的是我們這裡在Java層加載的動态庫(動态連結庫)

static{

System.loadLibrary("動态庫名稱");

}

在window下的動态庫是.dll檔案格式的,靜态庫是.a,動态庫不會被壓縮到.exe檔案中,但是我們安卓開發是基于linux核心的,是以我們使用的動态庫檔案是.so檔案格式,細心的讀者也許就發現了為什麼我們每次Java調用C、C++或者C、C++調用Java的靜态和普通的屬性、方法都一定要先通過(env)->來得到jclass,而且在JNI中方法都通過(env)->來調用方法,其實也不難猜出,屬性和方法被調用和操作一定是暴露了記憶體位址(指針),我們編寫C、C++檔案來實作Native方法來生成.so檔案供調用,其實也就變相說明了.so檔案和.dex(Java代碼打包)處于同一程序中,要不然也沒有辦法來互動,那麼當.dex和.so檔案被加載到Dailvik VM中時他們就是通過虛拟機的函數表來互動的,其實(*env)->就是一個虛拟機的函數表指針。