Android NDK入门 —— JNI加解密之一

编程入门 行业动态 更新时间:2024-10-22 14:26:46

Android NDK<a href=https://www.elefans.com/category/jswz/34/1770026.html style=入门 —— JNI加解密之一"/>

Android NDK入门 —— JNI加解密之一

前言


最近在忙其他事情,今天想起JNI做加解密不错,于是我调查了一下AES使用JNI实现,试验过程发现用C或者C++出了很多问题,于是发现有人使用一种巧妙的方式,用Java做加解密,只是把加解密的Key放在SO库中,这里我要讲的就是这种方式。

正文

新建java类

public class AESjni {public static native String myEncrypt(String str);public static native String myDecrypt(String str);
}

还是使用我们的Tools工具生成.h文件

接着编写c文件

#include "com_crayfish_ndkproject_AESjni.h"
#include <stdlib.h>
const char *DES_KEY = "12345678912345678912345678912345";
/*
* Class:     com_jzp_myapplication_JniUtils
* Method:    getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_crayfish_ndkproject_AESjni_myEncrypt(JNIEnv *env, jclass jclass1, jstring jstr)
{if (jstr == NULL) {return NULL;}jstring key;jstring result;jclass AESencrypt;jmethodID mid;AESencrypt = (*env)->FindClass(env, "com/crayfish/ndkproject/AESjni");if (NULL == AESencrypt) {return NULL;}mid = (*env)->GetStaticMethodID(env, AESencrypt, "encrypt","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");if (NULL == mid) {(*env)->DeleteLocalRef(env, AESencrypt);return NULL;}key = (*env)->NewStringUTF(env, DES_KEY);result = (*env)->CallStaticObjectMethod(env, AESencrypt, mid, key, jstr);(*env)->DeleteLocalRef(env, AESencrypt);(*env)->DeleteLocalRef(env, key);return result;
}JNIEXPORT jstring JNICALL Java_com_crayfish_ndkproject_AESjni_myDecrypt(JNIEnv *env, jclass jclass1, jstring jstr)
{if (jstr == NULL) {return NULL;}jstring key;jstring result;jclass AESencrypt;jmethodID mid;AESencrypt = (*env)->FindClass(env, "com/crayfish/ndkproject/AESjni");if (NULL == AESencrypt) {return NULL;}mid = (*env)->GetStaticMethodID(env, AESencrypt, "decrypt","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");if (NULL == mid) {(*env)->DeleteLocalRef(env, AESencrypt);return NULL;}key = (*env)->NewStringUTF(env, DES_KEY);result = (*env)->CallStaticObjectMethod(env, AESencrypt, mid, key, jstr);(*env)->DeleteLocalRef(env, AESencrypt);(*env)->DeleteLocalRef(env, key);return result;
}

看到c代码中有读取java类中encryptdecrypt两个方法了吧,我们把它们补上,这里就是真正的加解密逻辑。

 public static String encrypt(String key,String palinText) throws Exception{//加密return "";}public static String decrypt(String key,String palinText) throws Exception{//解密return "";}

记得配置Android.mkbuild.gradle

include $(CLEAR_VARS)
LOCAL_MODULE := AESjni
LOCAL_SRC_FILES := aesjni.c
include $(BUILD_SHARED_LIBRARY)
ndk{moduleName "AESjni"        //生成的so名字//abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无。}

结尾

今天的内容很简单,到这就结束了。

想学习更多Android知识,或者获取相关资料请加入Android技术开发交流3群:820655513。 有面试资源系统整理分享,Java语言进阶和Kotlin语言与Android相关技术内核,APP开发框架知识, 360°Android App全方位性能优化。Android前沿技术,高级UI、Gradle、RxJava、小程序、Hybrid、 移动架构师专题项目实战环节、React Native、等技术教程!架构师课程、NDK模块开发、 Flutter等全方面的 Android高级实践技术讲解。还有在线答疑

更多推荐

Android NDK入门 —— JNI加解密之一

本文发布于:2023-07-28 16:06:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1244976.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:入门   加解密   Android   NDK   JNI

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!