本节学习使用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); //"\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语言字符加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

解密:

Android学习JNI,使用JNI实现字符串加密的更多相关文章

  1. 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...

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

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

  3. Android JNI 学习(一):JNI 简介

    JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...

  4. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  5. 基于 Android NDK 的学习之旅-----JNI LOG 打印

    程序都是调出来的. 下面我介绍下JNI层的log打印方法的使用,类似与Android sdk提供的log 1.Android 应用层 MainActivity.java 主要功能代码 a)       ...

  6. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

  7. Android(java)学习笔记255:JNI之JNI概念

    1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?>  getClass(): ...

  8. Android(java)学习笔记199:JNI之JNI概念

    1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?>  getClass(): ...

  9. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  10. Android NDK开发之Jni的数据类型

    在前面的一篇博客<Android NDK开发简介>,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发.今天我再详细说明一下自己的学习经验. JNI是Java ...

随机推荐

  1. 关于 xftp 上传文件时,仅仅是上传了0字节的问题

    有两次,上传的时候出现了问题.能上传.可是上传过去的文件都是0字节.查看了各种配置,都是正常的:百思不得解: 后来想起近期在linuxserver运行apt-get update时,中间曾失败过,于是 ...

  2. n个整数全排列的递归实现(C++)

    全排列是很经常使用的一个小算法,以下是n个整数全排列的递归实现,使用的是C++ #include <iostream> using namespace std; int n = 0; vo ...

  3. inconsistent line endings 解决方法

     I'm using Unity 3D in combination with Visual Studio 2008 on a Windows 7 64 bit system. When savi ...

  4. 2015.03.12,外语,读书笔记-《Word Power Made Easy》 10 “如何讨论交谈习惯”学习笔记 SESSION 25

    1.about keeping one's mouth shut taciturn,名词形式taciturnity,沉默寡言. 美国第30任总统库里奇,以沉默寡言著称.他来自新英格兰,那里视tacit ...

  5. DB-MySQL:MySQL 连接的使用

    ylbtech-DB-MySQL:MySQL 连接的使用 1.返回顶部 1. Mysql 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多 ...

  6. APNs推送

    消息推送是可以指定声音的.譬如你可以对正面的反馈使用欢快的声音,对负面的反馈使用低沉一点的声音,都可以达到别出心裁让人眼前一亮的目的.你需要先放一些aiff.wav或者caf音频文件到app的资源文件 ...

  7. POJ 3252 组合数学?

    大神们的题解我一个都没看懂........... 十分的尴尬 题意:算出闭区间内二进制中0的个数大于等于1的个数的数字有多少个 思路: 组合数学(n小于500的时候都可以出解,只不过高精比较麻烦). ...

  8. [转]opencv学习资料

    转自:http://blog.csdn.net/poem_qianmo/article/details/20537737 1:Mat imread(const string& filename ...

  9. web产品浏览器兼容性问题你有考虑到吗?

    通常,动态网页除了Server端的代码撰写Client端代码也必须下不少工夫.例如:表单提交前的数据验证.图片的轮播.菜单的收合等等. 因此,对于Client端是否能正常执行指令码也必须适当的考察,然 ...

  10. 记录sql执行顺序

    SQL 语句执行顺序为: FROM WHERE GROUP BY HAVING SELECT DISTINCT UNION ORDER BY 关于 SQL 语句的执行顺序,有三个值得我们注意的地方: ...