NDK開發(fā)之Java-C互相傳值

CSDN鏈接? ? 在平時的NDK開發(fā)中,我們通常使用C/C++封裝好so庫,然后客戶端調(diào)用so庫以完成我們的需求,在上一遍入門中(NDK開發(fā)之初入門-Hello Word)我們在So庫方法中實現(xiàn)返回字符串Hello Word,然后在Java中進行調(diào)用so庫中實現(xiàn)好的方法,以達到我們的需求,那么如果我們需要在C/C++中調(diào)用Java中的方法時,該如何實現(xiàn)呢?或者在C/C++中修改Java中的數(shù)值,該如何實現(xiàn)呢?


一.C/C++中修改Java中的成員變量

1.首先我們在Java中定義一個成員變量key,public String key="voyageSun";我們的目的是修改當(dāng)前key的值,不過是使用C/C++進行修改。下圖中我們定義了一個字符串key,加載了一個so庫,accessField是C中具體功能的實現(xiàn)方法

Java中調(diào)用so庫實現(xiàn)類

2.看我們C/C++中具體實現(xiàn)

C中實現(xiàn)修改Java字符串的代碼

首先拿到j(luò)class,就是我們java中實現(xiàn)類的class文件,然后拿到屬性id,我們將根據(jù)這個屬性拿到需要修改的字符串量,GetFieldID有四個參數(shù),前兩個不需要解釋,分別傳入JNIEnv和jclass,第三個參數(shù)是我們獲取Java中字符串的key值,我們定義的字符串為public String key,在傳入key,若我們定義的字符串為public String TestString,那么傳入的就是TestString,此處傳入的就是變量名稱,第四個參數(shù)傳入的變量簽名,具體參照下圖Java屬性與方法簽名列表,若我們需要獲取的數(shù)據(jù)類型是int,那么該處需要傳入的參數(shù)為"I",現(xiàn)在我們獲取的是String類型的變量,那么需要傳入的就是Ljava/lang/String;(注:后面必須添加;)。獲取到該id后,然后根據(jù)id拿到Java中對應(yīng)的字符串,在C中修改字符串,修改完成后返回。其中核心思想就相當(dāng)于我們平時用到的反編譯。

Java屬性與方法簽名列表

3.編譯生成so庫,然后在Activity中調(diào)用該方法,會發(fā)現(xiàn)我們的字符串String已發(fā)生變化

調(diào)用so庫效果圖

我們在類中定義字符串key="voyageSun",然后在C中進行修改,添加前綴super,這樣就實現(xiàn)了在C中修改Java代碼得效果。


二.C/C++中修改Java中的靜態(tài)成員變量

套路還是一樣的,在Java中聲明靜態(tài)成員變量public static int count=1;,在C中修改其值,具體實現(xiàn)方法直接貼出來了

C中修改Java中的靜態(tài)成員變量方法

三.C/C++中修改Java中的方法,既然可以修改Java中的變量,那么可以修改Java方法嗎?肯定可以,我們在Java中定義一個方法public int getTestInt(int max){return max;},C中對其進行修改

c中修改java方法示例

通過上面的示例,我們發(fā)現(xiàn)可以調(diào)用C來實現(xiàn)修改Java代碼的目的,這樣Java調(diào)用C實現(xiàn)功能,C修改Java中代碼功能都可以實現(xiàn)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容