相关文章推荐
暴躁的石榴  ·  翻译 - Dolibarr ERP CRM ...·  4 月前    · 
不羁的饺子  ·  Debezium | Apache Flink·  4 月前    · 
讲道义的烈酒  ·  Debezium-JSON--流式计算 ...·  4 月前    · 
从容的大脸猫  ·  零代码第三方数据接入 | TDengine ...·  4 月前    · 
迷茫的马克杯  ·  从VBA中的范围中删除特殊字符开发者社区·  4 月前    · 
机灵的楼梯  ·  华润集团2023年营业收入8890亿元 ...·  1 年前    · 
谈吐大方的伏特加  ·  《三分野》:同样演张彬彬的“爱人”,吴倩、景 ...·  1 年前    · 
坚韧的红薯  ·  对市政协九届五次会议第344号提案的答复·  1 年前    · 
光明磊落的花生  ·  “一个民案,绊倒两名法官”后续:吉林王成忠案 ...·  1 年前    · 
刚分手的马铃薯  ·  CIImage 类 (CoreImage) ...·  1 年前    · 
Code  ›  Android学习JNI,使用JNI实现字符串加密开发者社区
jni string
https://cloud.tencent.com/developer/article/1995955
爱运动的毛豆
2 年前
作者头像
DragonKingZhu
0 篇文章

Android学习JNI,使用JNI实现字符串加密

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Linux内核深入分析 > Android学习JNI,使用JNI实现字符串加密

Android学习JNI,使用JNI实现字符串加密

作者头像
DragonKingZhu
发布 于 2022-05-08 16:41:30
417 0
发布 于 2022-05-08 16:41:30
举报

本节学习使用C语言加密字符串,大家都知道使用JAVA实现的加密都可以反编译的,而使用C写的加密是很难被反编译的。所以我们使用JNI学习如何使用C实现对字符串的加密。

首先:我们实现一个界面

布局文件就补贴出了。

其次:在MainActivity中增加一个加密和解密的本地方法

//加密本地方法
public native String encodeFromC(String text, int length);
//解密本地方法
public native String decodeFromC(String text, int length);

当加密的按钮按下时:

    public void encode(View v)
    	String passwd = et.getText().toString();
    	et.setText(encodeFromC(passwd, passwd.length()));
 将加密的字符显示到EditText上 

当解密的按钮按下时,将EditText中的字符解密,然后显示解密后的字符

    public void decode(View v)
    	String passwd = et.getText().toString();
    	et.setText(decodeFromC(passwd, passwd.length()));
 最后:实现本地方法 

#include <jni.h>
#include <String.h>
//把java的字符串转换成c的字符串,使用反射
char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
	 char*   rtn   =   NULL;
	 //1:先找到字节码文件
	 jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");
	 jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312");
	 //2:通过字节码文件找到方法ID
	 jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
	 //3:通过方法id,调用方法
	 jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
	 //4:得到数据的长度
	 jsize   alen   =   (*env)->GetArrayLength(env,barr);
	 //5:得到数据的首地址
	 jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
	 //6:得到C语言的字符串
	 if(alen   >   0)
	  rtn   =   (char*)malloc(alen+1);         //"\0"
	  memcpy(rtn,ba,alen);
	  rtn[alen]=0;
	 (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
	 return rtn;
 * Class:     com_demo_passwd_MainActivity
 * Method:    encodeFromC
 * Signature: (Ljava/lang/String;I)Ljava/lang/String;
JNIEXPORT jstring JNICALL Java_com_demo_passwd_MainActivity_encodeFromC
  (JNIEnv *env, jobject obj, jstring passwd, jint length)
	//1:将java的字符串转化为c语言
	char* cstr = Jstring2CStr(env, passwd);
	int i = 0;
	//2:给C语言字符加1
	for(i = 0; i < length; i++)
		*(cstr + i) += 1;
	//3:将c语言字符串转化为java字符串
	return (*env)->NewStringUTF(env, cstr);
 * Class:     com_demo_passwd_MainActivity
 * Method:    decodeFromC
 * Signature: (Ljava/lang/String;I)Ljava/lang/String;
JNIEXPORT jstring JNICALL Java_com_demo_passwd_MainActivity_decodeFromC
(JNIEnv *env, jobject obj, jstring passwd, jint length)
	//1:将java的字符串转化为c语言
	char* cstr = Jstring2CStr(env, passwd);
	int i = 0;
	//2:给C语言字符减1
	for(i = 0; i < length; i++)
 
推荐文章
暴躁的石榴  ·  翻译 - Dolibarr ERP CRM Wiki
4 月前
不羁的饺子  ·  Debezium | Apache Flink
4 月前
讲道义的烈酒  ·  Debezium-JSON--流式计算 Flink版-火山引擎
4 月前
从容的大脸猫  ·  零代码第三方数据接入 | TDengine 文档 | 涛思数据
4 月前
迷茫的马克杯  ·  从VBA中的范围中删除特殊字符开发者社区
4 月前
机灵的楼梯  ·  华润集团2023年营业收入8890亿元 利润总额880亿元-国务院国有资产监督管理委员会
1 年前
谈吐大方的伏特加  ·  《三分野》:同样演张彬彬的“爱人”,吴倩、景甜对比,差异明显_腾讯新闻
1 年前
坚韧的红薯  ·  对市政协九届五次会议第344号提案的答复
1 年前
光明磊落的花生  ·  “一个民案,绊倒两名法官”后续:吉林王成忠案二审维持原判_腾讯新闻
1 年前
刚分手的马铃薯  ·  CIImage 类 (CoreImage) | Microsoft Learn
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号