最近公司要求开发时把秘钥存放在的。所以文件中已确保秘钥的安全性,提高反编译的成本,这期间有一些坑,还好都解决了,现在分享给大家,希望大家能够少走弯路。主要分为以下三部分:
一:配置NDK环境
1.下载NDK,并配置,我的放在D盘,然后在AS中进行配置!
2.别忘了配置环境变量,否则后面进行NDK建造操作时,会报改指令不存在,复制NDK安装路径,添加到环境变量路径变量后面。
注:NDK配置如果不会的自行百度,百度一大堆教你配置的完整流程,我就不详细的说明了
二.编写代码,生成.so文件
(源代码链接:https://download.csdn.net/download/qq_20489601/10500930)
1.编写调用c文件的方法,以实现jni调用
/**
*@desc 编写调用c文件的方法
*@author zhengjun
*@created at 2018/7/18 11:35
*/
public class CkAppSecretUtils {
static{
System.loadLibrary("CkAppSecret");//
}
public static native String getAppSecret();//调用c文件的方法
public static native String getAppKey();
}
2.然后make project
生成对呀的.class文件
3.根据CkAppSecrectUtils.class文件生成.h文件
1. 找到你的项目路径,我的是D:\asWorkSpace\CkJniSo,然后进入到项目的app\src\main路径,在上方输入cmt进入电脑的命令提示符,如下图
2.输入 javah -d jni -classpath 编译后的class文件的绝对路径,如下图:
即可生成在app/src/main目录下自动创建一个包含.h文件的jni文件夹,我么不需要对这个文件做任何修改,内容如下;
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jniso_ck_com_ckjniso_CkAppSecretUtils */
#ifndef _Included_jniso_ck_com_ckjniso_CkAppSecretUtils
#define _Included_jniso_ck_com_ckjniso_CkAppSecretUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jniso_ck_com_ckjniso_CkAppSecretUtils
* Method: getAppSecret
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jniso_ck_com_ckjniso_CkAppSecretUtils_getAppSecret
(JNIEnv *, jclass);
/*
* Class: jniso_ck_com_ckjniso_CkAppSecretUtils
* Method: getAppKey
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jniso_ck_com_ckjniso_CkAppSecretUtils_getAppKey
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3、根据CkAppSecretUtils类编写main.c文件
#include "jniso_ck_com_ckjniso_CkAppSecretUtils.h"
JNIEXPORT jstring JNICALL Java_jniso_ck_com_ckjniso_CkAppSecretUtils_getAppSecret(JNIEnv *env, jobject jObj){
return (*env)->NewStringUTF(env, "931FCC9A1AB9C70E"); //此处返回appkey
}
JNIEXPORT jstring JNICALL Java_jniso_ck_com_ckjniso_CkAppSecretUtils_getAppKey(JNIEnv *env, jobject jObj){
//此处返回appsecret
return (*env)->NewStringUTF(env, "75CD1C16AF5A9BEC78E1D5CAEEE4B587");
}
4.添加Android.mk文件
# Copyright (C) 2010 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
//此处需要与CkAppSecretUtils中System.loadLibrary("CkAppSecret")的一致
LOCAL_MODULE := CkAppSecret
LOCAL_SRC_FILES := main.c //上个步骤添加的main.c文件
include $(BUILD_SHARED_LIBRARY)
5.添加Application.mk文件:
APP_ABI := all //表示生成所有类型的.so文件
APP_PLATFORM := android-10
6.根据步骤3一样,找到项目路径进入到命令提示符界面,然后输入 ndk-build命令,如图:
即可在项目的libs文件中生成.so文件,如图:
三.在其它项目中引用.so文件并调用其中的方法:
1.把生成的.so文件复制到你项目中的libs文件所对应的文件夹中
2.在你的项目中新建一个路径,必须与生成.so文件时中的CkAppSecretUtils包名路径一致,然后新建一个类CkAppSecretUtils名字也是保持一致,具体代码如下:
package jniso.ck.com.ckjniso;
/**
* @author zhengjun
* @desc jni调用,调用libCkAppSecret.so文件中的秘钥 appkey和appSecret的值,保证秘钥安全
* 注意:CkAppSecretUtils类所在的包名必须跟libCkAppSecret.so源代码中 CkAppSecretUtils的包名一致,否则调用不成功
* 即必须在jniso.ck.com.ckjniso此路径下
* @created at 2018/6/25 15:44
*/
public class CkAppSecretUtils {
static {
System.loadLibrary("CkAppSecret");
getAppSecret();
getAppKey();
}
public static native String getAppSecret();//调用c文件的方法,获取appsecret
public static native String getAppKey();//调用c文件的方法,获取appkey
}
3.配置好后,就可以在你的项目中进行调用了,比如要想获取appkey的值,直接调用CkAppSecretUtils .getAppSecret()即可。
友情提醒:需要本文中如何生成.so文件源代码的撸友们请狂点以下链接:
https://download.csdn.net/download/qq_20489601/10500930