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

人生处万类,知识最为贤。这篇文章主要讲述Android学习JNI,使用JNI实现字符串加密相关的知识,希望能为你提供帮助。
本节学习使用C语言加密字符串,大家都知道使用java实现的加密都能够反编译的,而使用C写的加密是非常难被反编译的。所以我们使用JNI学习怎样使用C实现对字符串的加密。

首先:我们实现一个界面

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

文章图片

布局文件就补贴出了。
其次:在MainActivity中添加一个加密和解密的本地方法

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


当加密的button按下时:

public void encode(View v) { String passwd = et.getText().toString(); et.setText(encodeFromC(passwd, passwd.length())); }


将加密的字符显示到EditText上
当解密的button按下时,将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,jstringjstr) { char*rtn=NULL; //1:先找到字节码文件 jclassclsstring=(*env)-> FindClass(env,"java/lang/String"); jstringstrencode=(*env)-> NewStringUTF(env,"GB2312"); //2:通过字节码文件找到方法ID jmethodIDmid=(*env)-> GetMethodID(env,clsstring,"getBytes","(Ljava/lang/String; )[B"); //3:通过方法id,调用方法 jbyteArraybarr=(jbyteArray)(*env)-> CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312"); //4:得到数据的长度 jsizealen=(*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++) { *(cstr + i) -= 1; } //3:将c语言字符串转化为java字符串 return (*env)-> NewStringUTF(env, cstr); }

显示效果:
当在输入框中输入:abcdefg
Android学习JNI,使用JNI实现字符串加密

文章图片

【Android学习JNI,使用JNI实现字符串加密】解密:
Android学习JNI,使用JNI实现字符串加密

文章图片







    推荐阅读