編輯:關於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中的字符解密,然後顯示解密後的字符
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
解密:
這一章將重點討論怎麼在應用中加入ffmpeg組件。所有測試都將在 Android Studio工具中進行。測試例子源地址:https://github.com/roman
前言最近在做按鈕的時候遇到在給按鈕設置一張圖片作為背景的同時還要自己定義圓角,最簡單的做法就是直接切張圓角圖作為按鈕就可以了,但是如果不這樣該怎麼辦呢,看代碼:下面來看效
前言Android開發中使用頂部 & 底部Tab導航欄的頻次非常高,主要的實現手段有以下:TabWidget 隱藏TabWidget,使用RadioGroup和R
你是qq火炬手嗎?在這個騰訊QQ為巴西裡約奧運會推出的火炬傳遞活動中你是第幾位火炬手了呢?QQ火炬好友火炬排行榜怎麼看?下面小編就來教教你!QQ火炬好友火炬