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); //"\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实现字符串加密的更多相关文章
- 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
		
原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...
 - Android学习笔记----Java中的字符串比较
		
用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...
 - Android JNI 学习(一):JNI 简介
		
JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...
 - Android JNI学习(二)——实战JNI之“hello world”
		
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
 - 基于 Android NDK 的学习之旅-----JNI LOG 打印
		
程序都是调出来的. 下面我介绍下JNI层的log打印方法的使用,类似与Android sdk提供的log 1.Android 应用层 MainActivity.java 主要功能代码 a) ...
 - android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
		
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...
 - Android(java)学习笔记255:JNI之JNI概念
		
1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?> getClass(): ...
 - Android(java)学习笔记199:JNI之JNI概念
		
1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?> getClass(): ...
 - 【转】Android JNI编程—JNI基础
		
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
 - Android NDK开发之Jni的数据类型
		
在前面的一篇博客<Android NDK开发简介>,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发.今天我再详细说明一下自己的学习经验. JNI是Java ...
 
随机推荐
- UVA 10196 Morning Walk(欧拉回路)
			
Problem H Morning Walk Time Limit 3 Seconds Kamalis a Motashotaguy. He has got a new job in Chittago ...
 - Android——隐藏输入法的小技巧
			
今天偶然在百度地图提供的DEMO里看到这样一段代码.认为确实是个小技巧,就写下来分享一下. 针对的问题: 我们在开发android界面的时候,常常使用EditText控件.然后每次进入这个页面的时候, ...
 - Hibernate Tools-代码生成
			
建立好数据库后,点击一个键,代码就生成了,这实在是份十分满意的事情.前面有介绍Hibernate Tools就能够生成代码,那么我们怎么利用它来生成代码呢. 以下就把具体步骤贴出来,相同,有图有真相. ...
 - Drupal 自己定义主题实体 Theming Custom Entities
			
在自己定义主题中输出结果时,有三个部分或很多其它特殊的函数.如 hook_menu,Page Callback.MODULE_theme 钩子 1.hook_menu 为了使用自己定义的实体.像创建. ...
 - Educational Codeforces Round 12 E. Beautiful Subarrays trie求两异或值大于等于k对数
			
E. Beautiful Subarrays One day, ZS the Coder wrote down an array of integers a with elements a1, ...
 - redis持久化,rdb,aof
			
RDB(Redis DataBase) AOF(Append Only File) 周阳语录:能撑过面试经理头一分钟最重要.头一分钟,决定人家还是否想跟你继续聊下去. RDB RDB就是在指定的时间内 ...
 - 使用CNN做文本分类——将图像2维卷积换成1维
			
使用CNN做文本分类 from __future__ import division, print_function, absolute_import import tensorflow as tf ...
 - JSTL中的常用EL函数(fn:contains(str,subStr))
			
转自:https://blog.csdn.net/u012843873/article/details/53289238 ① fn:toLowerCase ④fn:length fn:length函数 ...
 - CentOS 7 NAT模式上网配置
			
一 VMware 配置 在“编辑”选项卡中,选择“虚拟网络编辑器”,如下图: 选择VMnet8,修改子网IP与子网掩码,注意不要给“使用本地DHCP服务将IP地址分配给虚拟机”选项打勾,如下图: 点击 ...
 - webapi+DataTables
			
webapi + datatables 前言 之前写过一个关于DataTables的记录,是之前做webform的时候从后台一次性生成html代码,有很多弊端,就不多说了. 这次把最近研究的DataT ...