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

來源:互聯網
上載者:User

標籤:使用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語言字元加1for(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語言字元減1for(i = 0; i < length; i++){*(cstr + i) -= 1;}//3:將c語言字串轉化為java字串return (*env)->NewStringUTF(env, cstr);}
顯示效果:

當在輸入框中輸入:abcdefg

解密:


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.