Android NDK JNI 入门笔记-day04-NDK实现Hash算法
开头
前面的学习,我们已经掌握了 NDK 开发的必备知识。
下一步就要多实践,通过创造问题并解决问题,来增加熟练度,提升经验。
日常开发中,经常会用到 MD5 SHA1 SHA256 等 HASH 算法,我们可以在 Native 实现这些功能。
Hash 算法
HASH 主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的 128 位的编码里,叫做 HASH 值。也可以说,hash 就是找到一种数据内容和数据存放地址之间的映射关系。
Android 开发中,查看证书指纹:

动手实践
像之前一样创建一个 Native C++ 模板项目
项目准备

选用 C++ 开源 HASH 算法实现库

Android 工程引入 C++ 库源码

CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
# 该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名
aux_source_directory(hash-library HASH_LIBRARY_SRC)
# 添加头文件搜索目录
include_directories(hash-library)
add_library(
native-lib
SHARED
# 将 hash-library 源文件添加进来
native-lib.cpp ${HASH_LIBRARY_SRC})
find_library(
log-lib
log )
target_link_libraries(
native-lib
${log-lib} )
实现功能
MD5
Java 版本:
public static String md5(String plainText) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] md5Byte = md5.digest(plainText.getBytes());
return byteArrayToString(md5Byte);
} catch (Exception e) {
return "";
}
}
Native 版本:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_md5(JNIEnv *env, jclass clazz, jstring plaintext) {
const char * plaintextChar = env->GetStringUTFChars(plaintext, 0);
std::string plaintextStr = std::string(plaintextChar);
MD5 md5;
std::string md5String = md5(plaintextStr);
char * tabStr = new char [md5String.length()+1];
strcpy(tabStr, md5String.c_str());
char md5Result[128] = {0};
formatSignature(tabStr, md5Result);
return env->NewStringUTF(md5Result);
}
SHA1
Java 版本:
public static String sha1(String plainText) {
try {
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] sha1Byte = sha1.digest(plainText.getBytes());
return byteArrayToString(sha1Byte);
} catch (Exception e) {
return "";
}
}
Native 版本:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_sha1(JNIEnv *env, jclass clazz, jstring plaintext) {
const char * plaintextChar = env->GetStringUTFChars(plaintext, 0);
std::string plaintextStr = std::string(plaintextChar);
SHA1 sha1;
std::string sha1String = sha1(plaintextStr);
char * tabStr = new char [sha1String.length()+1];
strcpy(tabStr, sha1String.c_str());
char sha1Result[128] = {0};
formatSignature(tabStr, sha1Result);
return env->NewStringUTF(sha1Result);
}
SHA256
Java 版本:
public static String sha256(String plainText) {
try {
MessageDigest sha256 = MessageDigest.getInstance("SHA256");
byte[] sha256Byte = sha256.digest(plainText.getBytes());
return byteArrayToString(sha256Byte);
} catch (Exception e) {
return "";
}
}
Native 版本:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_sha256(JNIEnv *env, jclass clazz, jstring plaintext) {
const char * plaintextChar = env->GetStringUTFChars(plaintext, 0);
std::string plaintextStr = std::string(plaintextChar);
SHA256 sha256;
std::string sha256String = sha256(plaintextStr);
char * tabStr = new char [sha256String.length()+1];
strcpy(tabStr, sha256String.c_str());
char sha256Result[128] = {0};
formatSignature(tabStr, sha256Result);
return env->NewStringUTF(sha256Result);
}
最终效果

至此,我们已经学会了在 Android 项目中引用开源 C++ 库,同时我们也实现在 Native 实现 HASH 算法。
代码:
参考资料:
Oracle - JNI Types and Data Structures
Android NDK JNI 入门笔记-day04-NDK实现Hash算法的更多相关文章
- Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术 ...
- 「Android 开发」入门笔记
「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- Android之jni入门
jni即java native interface,使用jni我们可以在JAVA中调用C代码,提高了效率,可以复用代码,可以灵活的应用于各种场景 怎么使用JNI 安装软件 1.NDK 用于将C代码编译 ...
- JNI 入门
1.http://cherishlc.iteye.com/blog/1756762 Android 学习笔记--利用JNI技术在Android中调用.调试C++代码 2.http://my.eoe.c ...
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
- 二、Android NDK编程预备之Java jni入门Hello World
转自: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ...
- 【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...
随机推荐
- 公式化学习urllib(第一卷)
Import urllib.request 正常爬取网页: url=网址 +代表 下面测试一下: 结果我就不显示了 令html为读取后的对象 先用正则表达式抓取数据 Import re 令rule是抓 ...
- Nginx笔记总结七:root和alias文件路径配置
1. root path 配置段:http.server.location.if location ~ ^/weblogs/ { root /data/weglogs/www.ttlsa.com; a ...
- 解决jar包冲突
参考文档: http://www.jianshu.com/p/100439269148 idea plugin: https://www.cnblogs.com/huaxingtianxia/p/57 ...
- <USACO09FEB>庙会捷运Fair Shuttleの思路
一个没有被我成功证明的 贪心 但是 ac了的 别人排序都是排终点.但我的排终点错了emm排起点才对qvq 有没有人友情看看怎么证(没有 #include<cstdio> #include& ...
- 吴裕雄--天生自然 PYTHON语言数据分析:ESA的火星快车操作数据集分析
import os import numpy as np import pandas as pd from datetime import datetime import matplotlib imp ...
- Cobalt Strike学习笔记
Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透测试工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java ...
- 码海拾遗:strcpy()、strncpy()和strcpy_s()区别
1.strcpy() 原型:char *strcpy(char *dst,const char *src) 功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括'\0'结束符,返回ds ...
- TCPCopy 线上流量复制工具
TCPCopy是一种重放TCP流的工具,使用真实环境来测试互联网服务器上的应用程序. 一.描述: 虽然真实的实时流量对于Internet服务器应用程序的测试很重要,但是由于生产环境中的情况很负责,测试 ...
- HTML笔记06--浮动第一章
float --浮动 一 1.啥叫浮动? [使元素向左或向右移动,其周围的元素也会重新排列]简言之,就是让盒子并排. 通过float定义浮动 ---------- 未浮动样式代码如下: ------- ...
- 【深入理解Java虚拟机】类的初始化过程
类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...