CSDN鏈接? ? 在平時(shí)的NDK開(kāi)發(fā)中地熄,我們通常使用C/C++封裝好so庫(kù)晰筛,然后客戶(hù)端調(diào)用so庫(kù)以完成我們的需求,在上一遍入門(mén)中(NDK開(kāi)發(fā)之初入門(mén)-Hello Word)我們?cè)赟o庫(kù)方法中實(shí)現(xiàn)返回字符串Hello Word骤竹,然后在Java中進(jìn)行調(diào)用so庫(kù)中實(shí)現(xiàn)好的方法尿贫,以達(dá)到我們的需求,那么如果我們需要在C/C++中調(diào)用Java中的方法時(shí)溶推,該如何實(shí)現(xiàn)呢?或者在C/C++中修改Java中的數(shù)值徊件,該如何實(shí)現(xiàn)呢?
一.C/C++中修改Java中的成員變量
1.首先我們?cè)贘ava中定義一個(gè)成員變量key蒜危,public String key="voyageSun";我們的目的是修改當(dāng)前key的值虱痕,不過(guò)是使用C/C++進(jìn)行修改。下圖中我們定義了一個(gè)字符串key辐赞,加載了一個(gè)so庫(kù)部翘,accessField是C中具體功能的實(shí)現(xiàn)方法
2.看我們C/C++中具體實(shí)現(xiàn)
首先拿到j(luò)class,就是我們java中實(shí)現(xiàn)類(lèi)的class文件,然后拿到屬性id响委,我們將根據(jù)這個(gè)屬性拿到需要修改的字符串量新思,GetFieldID有四個(gè)參數(shù),前兩個(gè)不需要解釋?zhuān)謩e傳入JNIEnv和jclass赘风,第三個(gè)參數(shù)是我們獲取Java中字符串的key值夹囚,我們定義的字符串為public String key,在傳入key邀窃,若我們定義的字符串為public String TestString荸哟,那么傳入的就是TestString,此處傳入的就是變量名稱(chēng)瞬捕,第四個(gè)參數(shù)傳入的變量簽名鞍历,具體參照下圖Java屬性與方法簽名列表,若我們需要獲取的數(shù)據(jù)類(lèi)型是int肪虎,那么該處需要傳入的參數(shù)為"I",現(xiàn)在我們獲取的是String類(lèi)型的變量劣砍,那么需要傳入的就是Ljava/lang/String;(注:后面必須添加;)扇救。獲取到該id后刑枝,然后根據(jù)id拿到Java中對(duì)應(yīng)的字符串,在C中修改字符串迅腔,修改完成后返回仅讽。其中核心思想就相當(dāng)于我們平時(shí)用到的反編譯。
3.編譯生成so庫(kù)钾挟,然后在Activity中調(diào)用該方法洁灵,會(huì)發(fā)現(xiàn)我們的字符串String已發(fā)生變化
我們?cè)陬?lèi)中定義字符串key="voyageSun",然后在C中進(jìn)行修改掺出,添加前綴super徽千,這樣就實(shí)現(xiàn)了在C中修改Java代碼得效果。
二.C/C++中修改Java中的靜態(tài)成員變量
套路還是一樣的汤锨,在Java中聲明靜態(tài)成員變量public static int count=1;双抽,在C中修改其值,具體實(shí)現(xiàn)方法直接貼出來(lái)了
三.C/C++中修改Java中的方法闲礼,既然可以修改Java中的變量牍汹,那么可以修改Java方法嗎铐维?肯定可以,我們?cè)贘ava中定義一個(gè)方法public int getTestInt(int max){return max;}慎菲,C中對(duì)其進(jìn)行修改
通過(guò)上面的示例嫁蛇,我們發(fā)現(xiàn)可以調(diào)用C來(lái)實(shí)現(xiàn)修改Java代碼的目的,這樣Java調(diào)用C實(shí)現(xiàn)功能露该,C修改Java中代碼功能都可以實(shí)現(xiàn)了睬棚。