宸道移动安全 发表于 2020-10-30 15:46

反射获取Java层字段的值

一:新建activity_login布局文件,编写布局代码


1.打开eclipse工具,找到文章分享里面创建好的“xxx”工程,在工程中找到“res”目录,右键选择“New”选项下的“Android XML File”,弹出一个创建布局文件的对话框,填写布局文件名称为“activity_login”,选择布局文件类型为“LinearLayout”,然后点击Finish完成布局文件的创建,如下图所示。



2.编写布局xml文件的代码,分为两个步骤进行操作:
第一步:在根LinearLayout(线性布局)标签中添加属性       
android:gravity="center_vertical",使其内容竖向居中。
第二步:将之前编写的登录界面的代码复制到该文件中。       




3.布局代码编写完成后,切换到预览界面,如下图所示。



二:新建LoginActivity类


1.在“XXX”工程中找到src目录下的包名为comXXX的文件并选中,右键选择“New”下的“Class”,弹出新建类的对话框,在对话框中填写类名为LoginActivity后,点击Finish完成LoginActivity类的创建,如下图所示。



2.LoginActivity类创建完成后,开始编写Java代码,如下图所示。
- 第一步:加载布局界面。   第二步:声明成员变量。
- 第三步:初始化控件,在始化控件之前需要先定义相关成员变量。      
- 第四步:设置按钮监听事件。 第五步:获取编辑框内容。   
- 第六步:定义native方法。
- 第七步:调用native方法,判断用户输入的账号和密码是否正确。
- 第八步:如果输入的账号和密码正确,则跳转到MainActivity界面。



三:修改AndroidManifest.xml文件


在“XXX”工程中找到“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.XXX.LoginActivity”生成“.h”头文件,如下图所示。



返回“XXX”工程界面,选中src目录,右键F5刷新,看到一个com_XXX_MainActivity.h文件,将该文件移动至jni文件夹中,然后双击打开该文件,如下图所示。



五:编写C代码


在“XXX”工程中找到“jni”目录下的“XXX,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函数来比较用户输入的账号和密码是否正确。




六:编译动态链接库


在“xxx”工程下选中jni目录,右键选择“properties”,点击该选项弹出弹窗,复制“Location”对应的值,也就是文件路径D:\ Android\data\xxx\jni,复制成功后关闭对话框,如下图所示。



点击左下角“windows”图标,输入“cmd”命令打开窗口,输入“D:”切换至D盘,然后执行命令“cd D:\Android\data\xxx\jni”进入jni目录,紧接着执行“ndk-build”命令生成动态链接库“.so”文件,如下图所示。



七:修改so库加载位置


由于在调用native方法之前,要先加载so库,否则程序会崩溃,所以要将so库的位置进行修改,将MainActivity.java文件中的so库加载代码剪切至LoginActivity. java文件中,如下图所示。



八:运行应用程序


打开雷电模拟器,运行应用程序:选中“xxx”工程=>右键选择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、运行应用程序。


windy_ll 发表于 2020-10-30 17:01

改换成as了

Liture 发表于 2020-10-30 17:44

厉害lihai .

wangyuan0558 发表于 2020-10-30 20:39

学习一哈{:1_918:}

wyb1109_2008 发表于 2020-10-31 10:08

这个厉害,回头试一试。

gfslys 发表于 2020-10-31 16:16

学习了,谢谢分享

iuw 发表于 2020-10-31 19:20

这个目的是做啥的?没看懂。{:1_937:}

弗由 发表于 2020-11-1 21:22

学习了,感谢!

fcguo800 发表于 2020-11-4 11:24

大佬威武啊,好好学习一下,感谢分享。

bruce1202 发表于 2020-11-10 15:02

学习了,谢谢分享
页: [1] 2
查看完整版本: 反射获取Java层字段的值