• 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);

    当加密的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);         //""
    	  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

    解密:


  • 相关阅读:
    vmware fusion和mac共享目录
    安卓linker源码阅读01
    sublime text 快捷键
    eclipse使用经验汇总
    递归池:
    ubuntu下adb红米
    蛋疼问题汇总you must restart adb and eclipse
    JNI
    ARM寻址
    了解装饰器
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6915964.html
Copyright © 2020-2023  润新知