美文网首页
Linux编译Android可用的OpenSSL库并使用生成MD

Linux编译Android可用的OpenSSL库并使用生成MD

作者: itfitness | 来源:发表于2021-11-30 11:22 被阅读0次

    目录

    前言

    最近在研究一些库的编译,上次是编译了SeetaFace2,这次就拿OpenSSL来编译下,然后编译完后集成到Android项目中简单的生成个MD5。

    效果展示

    实现步骤

    1.编译

    具体的编译步骤与我之前的这篇文章差不多:Linux从零开始编译Android可用的 SeetaFace2库,主要的区别就是编译的代码是OpenSSL的源码(https://github.com/openssl/openssl),然后就是编译的命令有所区别,这里OpenSSL已经提供了Android的编译教程了(https://github.com/openssl/openssl/blob/master/NOTES-ANDROID.md),我们只需在终端执行如下命令即可(其中编译的目标库的架构和目标Android版本可以根据官方文档自行指定):

    export ANDROID_NDK_ROOT=/home/whoever/Android/android-sdk/ndk/20.0.5594570
    PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
    ./Configure android-arm64 -D__ANDROID_API__=29
    make
    

    编译完成后会生成如下两个文件(这是我们需要的):


    2.使用
    1)项目引入OpenSSL

    首先将生成的so库添加到项目中



    然后将源码中的include文件夹拷贝到cpp目录



    接下来编辑CMakeLists.txt文件
    cmake_minimum_required(VERSION 3.10.2)
    project("openssldemo")
    #导入头文件(可以让项目找到头文件,这样才能调用函数)
    include_directories("${CMAKE_SOURCE_DIR}/include")
    #配置动态链接库所在的目录
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}../../../../libs/${ANDROID_ABI}")
    add_library( # Sets the name of the library.
            openssldemo
            # Sets the library as a shared library.
            SHARED
            # Provides a relative path to your source file(s).
            native-lib.cpp)
    find_library( # Sets the name of the path variable.
            log-lib
            # Specifies the name of the NDK library that
            # you want CMake to locate.
            log)
    target_link_libraries( # Specifies the target library.
            openssldemo
            #OpenSSL
            crypto
            ssl
            # Links the target library to the log library
            # included in the NDK.
            ${log-lib})
    

    最后配置下build.gradle文件



    android {
        defaultConfig {
           省略部分代码...
            externalNativeBuild {
                cmake {
                    cppFlags ''
                    abiFilters 'arm64-v8a'
                }
            }
            ndk{
                //配置第三方库的架构类型,由于我们这里只有arm64-v8a的因此只配置了它
                abiFilters 'arm64-v8a'
            }
        }
        省略部分代码...
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    }
    
    
    2)检测是否引入成功

    这里我们创建一个函数用于获取OpenSSL的版本号
    Kotlin代码:

    /**
    * 获取OpenSSL版本号(用于检测导入是否成功)
    */
    external fun openSSLVersion(): String
    

    C代码:

    #include <jni.h>
    #include <string>
    #include"string.h"
    extern "C"{
        #include "openssl/crypto.h"
    }
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_itfitness_openssldemo_MainActivity_openSSLVersion(JNIEnv *env, jobject thiz) {
        return env->NewStringUTF(OpenSSL_version(OPENSSL_VERSION));
    }
    

    如果可以获取版本号说明导入成功了


    3)使用OpenSSL生成MD5

    接下来我们使用OpenSSL来实现生成MD5(也可以参考这篇文章的代码【MD5】linux下md5加密),函数如下:
    Kotlin代码:

     /**
    * 获取MD5加密的字符串
    */
    external fun getMD5String(str:String): String
    

    C代码:

    #include <jni.h>
    #include <string>
    #include"string.h"
    extern "C"{
        #include "openssl/md5.h"
    }
    extern "C" JNIEXPORT jstring JNICALL
    Java_com_itfitness_openssldemo_MainActivity_getMD5String(
            JNIEnv* env,
            jobject /* this */, jstring str) {
        const char *cStr = env->GetStringUTFChars(str, JNI_FALSE);
        unsigned char *data = (unsigned char *) cStr;
        unsigned char md[16];
        MD5(data,strlen(cStr),md);
        //必须进行如下操作否则会乱码
        int i;
        char tmp[3]={'\0'},buf[33]={'\0'};
        for (i = 0; i < 16; i++){
            sprintf(tmp,"%2.2x",md[i]);
            strcat(buf,tmp);
        }
        return env->NewStringUTF(buf);
    }
    

    Activity中调用如下:

    binding.sampleText.text = getMD5String("你好")
    

    效果如下:


    案例源码

    https://gitee.com/itfitness/openssl-demo

    相关文章

      网友评论

          本文标题:Linux编译Android可用的OpenSSL库并使用生成MD

          本文链接:https://www.haomeiwen.com/subject/isxdxrtx.html