本节学习使用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:通过字节码文件找到方法IDjmethodID   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实现字符串加密相关推荐

  1. android学习笔记之JNI

    转载请注明出处:http://blog.csdn.net/droyon/article/details/8661672 在android中,存在很多Native代码调用,这些调用如何实现的,当初很好奇 ...

  2. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: 1 string str1 = "abcd", str2 = "abcd"; 2 if(str1= ...

  3. 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )

    文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...

  4. android 中 Proguard 和JNI 相关

    在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...

  5. jni和java之间字符串的转换

    jni和java之间字符串的转换方法. C的实现: JNIEXPORT jstring JNICALL Java_Android123_CwjC (JNIEnv *env, jobject obj, ...

  6. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    文章目录 I . 动态注册流程 ( 总结 ) II . JNI_OnLoad 方法 III . 被注册的本地 C/C++ 方法参数 IV . JNINativeMethod 结构体 ( 核心重点 ) ...

  7. NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM(方法签名,CallXXXMethod)

    NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM 题目有点复杂,不过确实就是那么回事.这章想记录的内容比较多,先列出来: native static 与 nat ...

  8. android studio 单步调试jni,android studio实现Jni单步调试-标准配置教程

    本文主要介绍在android studio下实现jni单步调试时,所需要的配置及其步骤,这些也是本人经过几天折腾慢慢实现的,先提供给大家做参考: 1,配置是在mac下android studio实现的 ...

  9. 本地方法(JNI)——访问域+字符串参数

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--访问域+字符串参数 的基础知识 : 2) for source code, ...

  10. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

最新文章

  1. VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案...
  2. 从网上找到一个清晰CSS视频教程和大家分享一下
  3. SD-WAN与传统WAN设备相比
  4. R语言之离群点检验(part1)--利用箱线图原理检测离群点
  5. oracle mssql 实例,oracle,mysql,SqlServer三种数据库的分页查询的实例
  6. 手机modem开发(20)---公平性测试
  7. 常见熟知端口号的记忆技巧
  8. javax.xml.ws.WebServiceException: Provider com.sun.xml.ws.spi.ProviderImpl not found
  9. Android 使用传感器
  10. c语言知识点总完整版pdf,C语言知识点总结 重点版.pdf
  11. c语言编译bss和data,认识bss段和data段
  12. 一看就停不下来的中国史
  13. Stop Staring: Facial Modeling and Animation Done Right
  14. pr导入预设发现带入原片,选择合适序列预设即可
  15. 饥荒高脚鸟蛋孵化教程
  16. 多思计组实验 实验4总线与微命令实验
  17. android系统支持4T硬盘吗,电脑是否有可能,支持3T硬盘,但不支持4T硬盘
  18. Python之Socket自动重连
  19. Python错误集锦:pandas绘制多个子图时报错:AttributeError: ‘list’ object has no attribute ‘get_figure’
  20. 年轻程序员与老程序员的对话

热门文章

  1. javaScript 中创建json/转换字符串为json
  2. MFC-CFileException类学习笔记
  3. python代码打错怎么删除_Python程序员最常犯的十个错误
  4. CodeVS 1014 装箱问题(DP)
  5. windows server 2008 搭建文件共享服务
  6. 关于Apache的25个初中级面试题
  7. tomcat启动时出现Error starting static Resources 错误
  8. T-SQL连接查询,基础连接理解
  9. 尽量用iterator代替const_iterator
  10. 2 网段 Vlan+NAT 配置