Android学习JNI,使用JNI实现字符串加密
本节学习使用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++)