Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習JNI,使用JNI實現字符串加密

Android學習JNI,使用JNI實現字符串加密

編輯:關於Android編程

本節學習使用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 
#include 

//把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);         //
	  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

\

解密:

\

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved