JNI 3Des加解密

2019-02-25  本文已影响0人  ccDown

写了一个JNI的3Des加解密方法,github Demo:https://github.com/soulListener/JNIPratice


注意的几点:

1.通过AndroidStudio的AVDManager下载Cmake、LLDB、NDK
2.新建项目添加C++选项
3.开始编码
4.编译项目之后在app->intermediates->cmake中找到编译好的so库文件

1.查看方法签名 javap -s 类的路径,如查看SecretKeySpec的签名:

javap -s javax/crypto/spec/SecretKeySpec
签名

比如想要操控java中的javax.crypto.spec.SecretKeySpec类,需要先找到该类,找到它的构造方法,然后创建这个类Des的对象

jclass SecretKeySpec = env->FindClass("javax/crypto/spec/SecretKeySpec");
jmethodID SecretKeySpecId = env->GetMethodID(SecretKeySpec, "<init>", "([BLjava/lang/String;)V");
jstring algorithm = env->NewStringUTF("DESede");
jobject spcretKeySpec = env->NewObject(SecretKeySpec, SecretKeySpecId, en_key, algorithm);

上述代码实际效果相当于java中的

SecretKeySpec secretKeySpec = new SecretKeySpec(en_key,"DESede");

类比反射是一样的操作过程。

最后在JNI层不使用的时候一定要释放该对象

env->DeleteLocalRef(spcretKeySpec);
  1. Log日志打印

头文件

#include<android/log.h>
#ifndef LOG_TAG
#define LOG_TAG "JniUtils的Log"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG ,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG ,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG ,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG ,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG ,__VA_ARGS__) // 定义LOGF类型
#endif

代码中

LOGE("哈哈哈");

3.String 一定要转换为 newStringUTF();
4.调用java层次的方法感觉还是跟java的反射是一个类型的东西
5.将JNI抛异常到java层
6.释放内存(神TM费劲)

上一篇 下一篇

猜你喜欢

热点阅读