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库。目前可有可无。
        }

结尾

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 本人为初学者,文章写得不好,如有错误,请大力怼我 或者看这里 如何使用jni进行开发 本文主要针对Android环...
    AlbertHumbert阅读 4,694评论 2 12
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,982评论 25 708
  • demo链接在文末。 在Android Studio中有3种方法生成so文件。 最初的时候,我曾经使用过Visua...
    梧叶已秋声阅读 33,877评论 5 26
  • 他们相遇在夏天,宋温暖一袭白裙笑得和她的名字一样温暖阳光,那一刻深深的映在苏里心窝。宋温暖在不远处望着这个呆呆的看...
    猫栗叔叔阅读 274评论 1 0