写了一个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);
- 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费劲)
网友评论