AS生成.so文件并在其它项目中进行引用,调用里面的方法

最近公司要求开发时把秘钥存放在的。所以文件中已确保秘钥的安全性,提高反编译的成本,这期间有一些坑,还好都解决了,现在分享给大家,希望大家能够少走弯路。主要分为以下三部分:
一:配置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
make project
生成对呀的.class文件
生成对呀的.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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要使用 Python 的 `ctypes` 模块将 `libAes128.so` 动态链接库加载到 Python ,然后调用的加密和解密函数。以下是一个简单的示例代码: ```python import os import ctypes # 加载动态链接库 lib = ctypes.cdll.LoadLibrary('/lib/arm64/libAes128.so') # 定义加密函数 def encrypt_file(key, in_file, out_file): # 打开输入文件和输出文件 with open(in_file, 'rb') as f_in, open(out_file, 'wb') as f_out: # 读取输入文件内容 data = f_in.read() # 计算输入文件大小 size = os.path.getsize(in_file) # 调用动态链接库的加密函数 lib.Aes128_Encrypt(key, data, size) # 将加密后的内容写入输出文件 f_out.write(data) # 定义解密函数 def decrypt_file(key, in_file, out_file): # 打开输入文件和输出文件 with open(in_file, 'rb') as f_in, open(out_file, 'wb') as f_out: # 读取输入文件内容 data = f_in.read() # 计算输入文件大小 size = os.path.getsize(in_file) # 调用动态链接库的解密函数 lib.Aes128_Decrypt(key, data, size) # 将解密后的内容写入输出文件 f_out.write(data) # 测试加密和解密 key = b'my_secret_key_1234' in_file = 'test.zip' out_file = 'test_encrypted.zip' encrypt_file(key, in_file, out_file) print('文件已加密') in_file = 'test_encrypted.zip' out_file = 'test_decrypted.zip' decrypt_file(key, in_file, out_file) print('文件已解密') ``` 这个示例代码,我们假设 `libAes128.so` 有两个函数 `Aes128_Encrypt` 和 `Aes128_Decrypt`,用于进行加密和解密。这两个函数的参数分别为密钥、待加密/解密的数据和数据大小。我们使用 Python 的 `ctypes` 模块将这两个函数加载到 Python ,并定义 `encrypt_file` 和 `decrypt_file` 两个函数,分别用于对输入文件进行加密和解密。最后,我们使用 `test.zip` 文件进行测试,测试结果会生成 `test_encrypted.zip` 和 `test_decrypted.zip` 两个文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值