通常我們也可以直接利用jni來通路和處理類的變量,不一定非要通過Java方法來操作Java類變量。對類變量操作時,類的靜态變量和類的執行個體變量的操作稍微有些不同,下面進行講解。
類的靜态變量屬于類,是所有該類執行個體共享的。操作該變量時,不需要指定具體的執行個體是哪個。
主要步驟就是代碼裡面注釋的。
代碼如下:
JNI開發也有JNI開發的套路,按照上面套路來,即可修改類的執行個體變量。操作過程也很好了解,我們在native操作的時候都需要借助JNI提供的函數擷取相應的引用。利用引用去進行操作。由于JNI函數是直接操作JVM中的資料結構,是以即使是private的變量,我們也可以進行修改。
由于JNI函數是直接操作JVM中的資料結構,不受Java通路修飾符的限制。即,在本地代碼中可以調用JNI函數可以通路Java對象中的非public屬性和方法
通路和修改靜态變量操作步聚:
調用FindClass函數擷取類的Class引用
調用GetStaticFieldID函數擷取Class引用中某個靜态變量ID
調用GetStaticXXXField函數擷取靜态變量的值,需要傳入變量所屬Class的引用和變量ID
調用SetStaticXXXField函數設定靜态變量的值,需要傳入變量所屬Class的引用、變量ID和變量的值
通路和修改執行個體變量操作步聚:
調用GetObjectClass函數擷取執行個體對象的Class引用
調用GetFieldID函數擷取Class引用中某個執行個體變量的ID
調用GetXXXField函數擷取變量的值,需要傳入執行個體變量所屬對象和變量ID
調用SetXXXField函數修改變量的值,需要傳入執行個體變量所屬對象、變量ID和變量的值