Android編譯存放祕鑰的so文件

Android編譯存放祕鑰的so文件

爲了安全起見,有時我們會把祕鑰放在so文件中,那麼so文件是如何被編譯出來和使用的呢?
參考鏈接:https://www.jianshu.com/p/faa3eebbd401

1. 創建java文件。

public class JNIUtil {

    static {
        System.loadLibrary("web-lib");
    }

    public static native String initData();
}

2. 通過java文件生成 jni

  1. 在代碼目錄main目錄下創建jni的目錄
  2. 通過創建好的java文件自動生成.h文件
    有兩種方法都可以生成
    (1)通過命令生成
    (2)可以創建一個類似於快捷操作的方法
    Setting->Tools->External Tools 添加一個操作方式
    對應的內容如下:
Name: ndk-build

Program:$JDKPath$\bin\javah.exe
Argument:-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory:$ModuleFileDir$\src\main\Java

說明: Programjavah的路徑,需要根據JDK的路徑做調整,其它的參數可與上訴保持一致。

  1. 光標對準第一步中創建的java文件,右鍵->External Tools->ndk-build (此時會在jni中生成對應的.h文件)

3. 創建Android.mkApplication.mkc 文件

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := web-lib

LOCAL_SRC_FILES := jni.c

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI:=all

jni.c

#include <stdio.h>

#include <com_bupin_jni_JNIUtil.h>


JNIEXPORT jstring JNICALL
Java_com_bupin_jni_JNIUtil_initData(JNIEnv *env, jobject jobj){
  char *cstr = "xxx";
  jstring jstr = (*env)->NewStringUTF(env, cstr);
return jstr;
}


4. 添加build文件

在app/build.gradle 中的 android 標籤內


  sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDirs = ['src/main/jniLibs']//設置目標的so存放路徑
    }

    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {

        commandLine "F:\\AndroidStudioSdk\\ndk\\20.1.5948944\\ndk-build.cmd", //配置ndk的路徑

                'NDK_PROJECT_PATH=build/intermediates/ndk', //ndk默認的生成so的文件

                'NDK_LIBS_OUT=src/main/jniLibs', //配置的我們想要生成的so文件所在的位置

                'APP_BUILD_SCRIPT=src/main/jni/Android.mk',//指定項目以這個mk的方式

                'NDK_APPLOCATION_MK=src/main/jni/Application.mk'//指定項目以這個mk的方式

    }

    tasks.withType(JavaCompile) {
            //使用ndkBuild
        compileTask -> compileTask.dependsOn ndkBuild

    }

5. 編譯成so

點擊 Build -> Make Project
此時會在相應的目錄中生成so文件。

此時就可以使用so文件了。

直接使用即可使用了


JNIUtil.initData()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章