本节学习使用C语言加密字符串,大家都知道使用JAVA实现的加密都能够反编译的,而使用C写的加密是非常难被反编译的。所以我们使用JNI学习怎样使用C实现对字符串的加密。
首先:我们实现一个界面
布局文件就补贴出了。
其次:在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, 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); //"