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

解密:

时间: 2024-08-26 23:22:44

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

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

原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过JNI的可以看看我之前的博客(Windows下利用Visual Studio开发的过程):http://cherishlc.iteye.com/admin/blogs/1328136 以及自动生成工具swig的

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

用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: 1 string str1 = "abcd", str2 = "abcd"; 2 if(str1==str2) 3 { 4 return true; 5 } 6 else 7 { 8 return false; 9 } 殊不知在Java中,两个String类型的变量,尽管字符相同,使用”==“进行比较,也会返回false. Java中进行字符串比较需采用String类型的equals方法: 1 Strin

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

JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低. 然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能. 接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率.

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

1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?>  getClass():   (来自源码Object.java) 上面方法没有方法体,但是它不是抽象方法,它是具体方法,因为它加了native修饰了,说明这个方法是使用底层C实现的. java提供JNI这个接口规范,可以去调用其他程序语言编写的功能模块(不必要利用java重新开发),可以调用C/C++,或者VB等等. 2.  为什么要

【转】Android JNI编程—JNI基础

原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它们都用到了JNI编程,并且JNI编程也贯穿了Android系统,学会JNI编程对于我们学习研究Android源码.Android安全以及Android安全加固等都是有所帮助的.但是对于我们这些写Android应用的,大部分时间都是在使用Java编程,很少使用C/C++编程,对于JNI编程也了解的比较

浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制

浅析android下如何通过jni监控wifi网络连接.dhcpcd执行和power电源控制 =============================================================================================================libs/android_runtime/android_net_wifi_Wifi.cpp部分jni接口static JNINativeMethod gWifiMethods[] = {

Android Studio下Java Jni技术

最近开发Android的过程中需要通过C来调用Android终端中的某些API,而我是用JAVA语言来开发的Android程序,所以就需要用到JNI调用. 流程是,用C来调用Android硬件接口,约定JAVA调用C的接口,然后把这些代码封装编译成.so文件.然后就是怎么引入与调用了. 1.将.so文件加入到libs目录下,.so文件命名规范为lib*,lib后加上名字. 2.加入jniLibs路径配置,在build.gradle中加入如下配置: android {     --     sou

android如何使用自定义JNI接口,以及NDK工具的环境搭建与使用。

一.环境的搭建: 1.需要的工具: A.cygwin    (在windows下使用LINUX系统)                                                                    http://www.cygwin.com B.android-ndk-1.6_r1-windows (主要是起到将C或C++编译成动态库的作用)   http://dl.google.com/android/ndk/android-ndk-1.6_r1-wind

udacity android学习笔记: lesson 3

udacity android学习笔记: lesson 3 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/master/Markdown/an

六、Android学习笔记_JNI_c调用java代码

1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // C调用java空方法 public void helloFromJava() { System.out.println("hello from java"); } // C调用java中的带两个int参数的方法 public int Add(int x, int y) { int res