反射獲取Java層字段的值

往期推薦

JNI動態註冊

JNI靜態註冊

Android NDK–JNI接口

如何編譯可執行程序

今天結合登錄功能講解反射獲取Java層字段的值。

一:新建activity_login佈局文件,編寫佈局代碼

1.打開eclipse工具,找到昨天文章分享裏面創建好的「yijindaxue」工程,在工程中找到「res」目錄,右鍵選擇「New」選項下的「Android XML File」,彈出一個創建佈局文件的對話框,填寫佈局文件名稱爲「activity_login」,選擇佈局文件類型爲「LinearLayout」,然後點擊Finish完成佈局文件的創建,如下圖所示。

在這裏插入圖片描述

2.編寫佈局xml文件的代碼,分爲兩個步驟進行操作:
第一步:在根LinearLayout(線性佈局)標籤中添加屬性
android:gravity=「center_vertical」,使其內容豎向居中。
第二步:將之前編寫的登錄界面的代碼複製到該文件中。

在這裏插入圖片描述在這裏插入圖片描述

3.佈局代碼編寫完成後,切換到預覽界面,如下圖所示。

在這裏插入圖片描述

二:新建LoginActivity類

1.在「yijindaxue」工程中找到src目錄下的包名爲com.yijindaxue的文件並選中,右鍵選擇「New」下的「Class」,彈出新建類的對話框,在對話框中填寫類名爲LoginActivity後,點擊Finish完成LoginActivity類的創建,如下圖所示。

在這裏插入圖片描述

2.LoginActivity類創建完成後,開始編寫Java代碼,如下圖所示。

  • 第一步:加載佈局界面。 第二步:聲明成員變量。
  • 第三步:初始化控件,在始化控件之前需要先定義相關成員變量。
  • 第四步:設置按鈕監聽事件。 第五步:獲取編輯框內容。
  • 第六步:定義native方法。
  • 第七步:調用native方法,判斷用戶輸入的賬號和密碼是否正確。
  • 第八步:如果輸入的賬號和密碼正確,則跳轉到MainActivity界面。

在這裏插入圖片描述

三:修改AndroidManifest.xml文件

在「yijindaxue」工程中找到「AndroidManifest.xml」文件,修改程序入口界面爲「LoginActivity」,再添加一個活動組件「MainActivity」,如下圖所示。

在這裏插入圖片描述

四: 生成.h文件

在「yijindaxue」工程下選中src目錄右鍵選擇最後一項,properties,點擊該選項彈出彈窗,複製Location對應的值,也就是文件的路徑D:\Android \data\yijindaxue\src,複製成功後關閉對話框,如下圖所示。

在這裏插入圖片描述

點擊左下角「windows」圖標,輸入「cmd」命令打開窗口,輸入「D:」切換到D盤,然後執行命令「cd D:\Android\data\yijindaxue\src」,進入src目錄,緊接着執行命令「javah -jni com.yijindaxue.LoginActivity」生成「.h」頭文件,如下圖所示。

在這裏插入圖片描述

返回「yijindaxue」工程界面,選中src目錄,右鍵F5刷新,看到一個com_yijindaxue_MainActivity.h文件,將該文件移動至jni文件夾中,然後雙擊打開該文件,如下圖所示。

在這裏插入圖片描述

五:編寫C代碼

在「yijindaxue」工程中找到「jni」目錄下的「yijindaxue.c」文件,雙擊打開該文件,編寫相應的C代碼。

使用「#include」命令導入之前生成的頭文件,然後將頭文件中的函數複製粘貼至下圖方框位置,刪除「;」,並添加{},在對應的類型後面添加兩個變量名env和obj,如下圖所示。

在這裏插入圖片描述

編寫C代碼,反射獲取Java層字段的值,如下圖所示。
1.調用FindClass函數獲取對應的類。
2.獲取Java層實例字段的值:

  • 第一步:調用GetFieldID函數獲取Java層實例字段的ID。
  • 第二步:調用GetObjectField函數獲取Java層實例字段的值。
  • 第三步:調用GetStringUTFChars函數將jstring類型轉換爲char*類型。

3.獲取Java層靜態字段的值:

  • 第一步:調用GetStaticFieldID函數獲取Java層靜態字段的ID。
  • 第二步:調用GetStaticObjectField函數獲取Java層實例字段的值。
  • 第三步:調用GetStringUTFChars函數將jstring類型轉換爲char*類型。

4.調用strcmp函數來比較用戶輸入的賬號和密碼是否正確。

在這裏插入圖片描述

六:編譯動態鏈接庫

在「yijindaxue」工程下選中jni目錄,右鍵選擇「properties」,點擊該選項彈出彈窗,複製「Location」對應的值,也就是文件路徑D:\ Android\data\yijindaxue\jni,複製成功後關閉對話框,如下圖所示。

在這裏插入圖片描述

點擊左下角「windows」圖標,輸入「cmd」命令打開窗口,輸入「D:」切換至D盤,然後執行命令「cd D:\Android\data\yijindaxue\jni」進入jni目錄,緊接着執行「ndk-build」命令生成動態鏈接庫「.so」文件,如下圖所示。

在這裏插入圖片描述

七:修改so庫加載位置

由於在調用native方法之前,要先加載so庫,否則程序會崩潰,所以要將so庫的位置進行修改,將MainActivity.java文件中的so庫加載代碼剪切至LoginActivity. java文件中,如下圖所示。

在這裏插入圖片描述

八:運行應用程序

打開雷電模擬器,運行應用程序:選中「yijindaxue」工程=>右鍵選擇Run As選項=> 點擊Android Application。

運行該程序後,當輸入正確的賬號和密碼,會彈出彈窗提示登錄成功,並且跳轉到了主頁面。

小結:

登錄功能實現流程完成:

1、新建activity_login佈局文件,編寫代碼是登錄界面。

2、新建LoginActivity類,編寫Java層登錄邏輯。

  • 第一步:加載佈局界面。
  • 第二步:聲明成員變量。
  • 第三步:初始化控件。
  • 第四步 :設置按鈕監聽事件。
  • 第五:獲取編輯框內容。
  • 第六步:定義native方法。
  • 第七步:調用native方法,判斷用戶輸入的賬號和密碼是 否正確。
  • 第八步:如果輸入的賬號和密碼正確,則跳轉MainActivity界面。

3、修改AndroidManifest.xml文件。

4、執行javah命令生成.h頭文件,並將頭文件移到jni文件夾。

5、編寫C代碼,獲取Java層字段的值。

  • 第一步:使用#include導入頭文件。
  • 第二步:編寫C代碼獲取Java層實例字段的值。
  • 第三步:編寫C代碼獲取Java層靜態字段的值。
  • 第四步:判斷用戶輸入的賬號和密碼是否正確。

6、使用NDK工具編譯.c文件生成動態鏈接庫.so文件。

7、修改so庫加載位置。

8、運行應用程序。

如果你也對安卓逆向感興趣。可以加下方的羣,大家一起討論問題,或者掃描下方二維碼關注公衆號,關注回覆 「安卓逆向」 獲取免費教程

安卓逆向交流學習:1139349849
vx:Yjxiaox

在這裏插入圖片描述