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 ...
随机推荐
- 吴裕雄--天生自然KITTEN编程:逃离漩涡
- 将js进行到底:node学习10
node.js数据库篇--MySQL NoSQL大行其道的如今,MySQL这样的关系型数据库依然有着不可撼动的位置,对于中型,大型面向对象的项目,关系型数据库依然是首选,真正的项目,应当是将数据库的任 ...
- vue子组件使用自定义事件向父组件传递数据
使用v-on绑定自定义事件可以让子组件向父组件传递数据,用到了this.$emit(‘自定义的事件名称’,传递给父组件的数据) <!DOCTYPE html> <html lang= ...
- 从Note 5看三星大招 究竟能不能秒杀iPhone
5看三星大招 究竟能不能秒杀iPhone" title="从Note 5看三星大招 究竟能不能秒杀iPhone"> 从当年HTC发布第一代Android手机G1开始 ...
- JavaScript值类型和引用类型有哪些
JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数.
- ant:如何用ant将web project打包成war包
说明:src中的文件将不会呈现出来,诸位可以自己写一个简单的web项目,然后依照我所提供的ant脚本配置来设置. 文件结构如图所示: 配置为下: build.xml < ...
- Hexo博客maupassant主题添加Google Adsense广告
自从在 Github Page 落户以后,很长一段时间使用的是极简且有点艺术范儿的 fexo 主题,而不是大名鼎鼎的 next 主题.后来偶然发现了符合我审美的Hexo博客 maupassant 主题 ...
- 小程序在ios10.2系统上兼容
1. 定位元素在ios10.2系统上出现样式问题??? 没错,就是在测试在侧道ios10.2系统时发现了样式错误的问题,比如一个Swiper中,最后一个展示有问题. 这是啥原因❓❓❓❓❓❓ 大写的问 ...
- 【WPF学习】第五十一章 动画缓动
线性动画的一个缺点是,它通常让人觉得很机械且不能够自然.相比而言,高级的用户界面具有模拟真实世界系统的动画效果.例如,可能使用具有触觉的下压按钮,当单击时按钮快速弹回,但是当没有进行操作时它们会慢慢地 ...
- CentOS7 部署K8S集群,最新版1.17.3-0
小白在网上找了很多关于k8s集群部署的文档,但是版本老旧,到处踩坑,终于部署成功,记录下过程. 一.准备工作 虚拟机:VMware® Workstation 15 Pro Xhell 6:Xshell ...