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

前言

我會在小專欄簡書一起分享。
最近在忙其他事情,今天想起JNI做加解密不錯,于是我調(diào)查了一下AES使用JNI實現(xiàn),試驗過程發(fā)現(xiàn)用C或者C++出了很多問題,于是發(fā)現(xiàn)有人使用一種巧妙的方式,用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體系結(jié)構(gòu)下的so庫。目前可有可無。
        }

結(jié)尾

今天的內(nèi)容很簡單,到這就結(jié)束了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,500評論 19 139
  • 本人為初學(xué)者,文章寫得不好,如有錯誤,請大力懟我 或者看這里 如何使用jni進(jìn)行開發(fā) 本文主要針對Android環(huán)...
    AlbertHumbert閱讀 4,831評論 2 12
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,675評論 25 709
  • demo鏈接在文末。 在Android Studio中有3種方法生成so文件。 最初的時候,我曾經(jīng)使用過Visua...
    梧葉已秋聲閱讀 34,207評論 5 26
  • 他們相遇在夏天,宋溫暖一襲白裙笑得和她的名字一樣溫暖陽光,那一刻深深的映在蘇里心窩。宋溫暖在不遠(yuǎn)處望著這個呆呆的看...
    貓栗叔叔閱讀 309評論 1 0

友情鏈接更多精彩內(nèi)容