Android App开发之利用JNI实现加密和解密操作实战(附源码 简单易懂)

简介: Android App开发之利用JNI实现加密和解密操作实战(附源码 简单易懂)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~

一、JNI实现加密和解密

在实际开发中 JNI主要应用于以下场景

1:对关键业务数据进行加密和解密

Java代码容易遭到破解,JNI加密更加安全

2:底层的网络操作与设备操作

Java作为一门高级程序设计语言 与硬件和网络操作的隔阂比C/C++大,它不想它俩那样容易驾驭硬件和网络的操作

3:对运行效率要求较高的场合

同样的操作C/C++执行效率比Java高很多,另外,图像处理,音视频处理等需要大量运算的场合,其底层算法也都是用C/C++实现。

4:跨平台的应用移植

移动设备的操作系统不是Android就是IOS,如果部分业务功能采用C/C++实现,那么不但Android可以通过JNI调用,而且IOS能直接编译运行,一份代码可以同时被两个平台复用,省时省力

接下来尝试使用JNI完成加解密操作,采用的是AES算法C++的开源代码,主要的改造工作是给C++源代码配上JNI接口

效果如下 分别输入原始字符串并调用JNI接口进行加密,并且对已加密的字符串进行JNI解密操作

代码如下

Java类

package com.example.ebook;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class JniSecretActivity extends AppCompatActivity {
    private EditText et_origin; // 声明一个用于输入原始字符串的编辑框对象
    private TextView tv_encrypt; // 声明一个文本视图对象
    private TextView tv_decrypt; // 声明一个文本视图对象
    private String mKey = "123456789abcdef"; // 该算法要求密钥串的长度为16位
    private String mEncrypt; // 加密串
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jni_secret);
        et_origin = findViewById(R.id.et_origin);
        tv_encrypt = findViewById(R.id.tv_encrypt);
        tv_decrypt = findViewById(R.id.tv_decrypt);
        findViewById(R.id.btn_encrypt).setOnClickListener(v -> {
            // 调用JNI方法encryptFromJNI获得加密后的字符串
            mEncrypt = encryptFromJNI(et_origin.getText().toString(), mKey);
            tv_encrypt.setText("jni加密结果为:"+mEncrypt);
        });
        findViewById(R.id.btn_decrypt).setOnClickListener(v -> {
            if (TextUtils.isEmpty(mEncrypt)) {
                Toast.makeText(this, "请先加密后再解密", Toast.LENGTH_SHORT).show();
                return;
            }
            // 调用JNI方法decryptFromJNI获得解密后的字符串
            String raw = decryptFromJNI(mEncrypt, mKey);
            tv_decrypt.setText("jni解密结果为:"+raw);
        });
    }
    // 声明encryptFromJNI是来自于JNI的原生方法
    public native String encryptFromJNI(String raw, String key);
    // 声明decryptFromJNI是来自于JNI的原生方法
    public native String decryptFromJNI(String des, String key);
    // 在加载当前类时就去加载libcommon.so,加载动作发生在页面启动之前
    static {
        System.loadLibrary("common");
    }
}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical"
    android:padding="5dp" >
    <EditText
        android:id="@+id/et_origin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:background="@drawable/editext_selector"
        android:inputType="text"
        android:hint="请输入待加密的字符串"
        android:textColor="@color/black"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_encrypt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="调用jni接口获取加密串"
        android:textColor="@color/black"
        android:textSize="17sp" />
    <TextView
        android:id="@+id/tv_encrypt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这里显示jni加密结果"
        android:textColor="@color/black"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_decrypt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="调用jni接口获取解密串"
        android:textColor="@color/black"
        android:textSize="17sp" />
    <TextView
        android:id="@+id/tv_decrypt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这里显示jni解密结果"
        android:textColor="@color/black"
        android:textSize="17sp" />
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
332 0
|
存储 Java PHP
轻量化短视频电商直播带货APP源码全解析:核心功能与设计流程​
在电商直播热潮下,开发专属直播带货APP成为抢占市场关键。本文详解原生开发轻量化APP的核心功能与全流程设计,涵盖用户登录、商品浏览、直播互动、购物车、订单及售后功能,并介绍安卓端Java、苹果端Object-C、后台PHP的技术实现,助力打造高效优质的直播电商平台。
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
存储 缓存 安全
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
615 2
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
1632 4
|
数据采集 JSON 网络安全
移动端数据抓取:Android App的TLS流量解密方案
本文介绍了一种通过TLS流量解密技术抓取知乎App热榜数据的方法。利用Charles Proxy解密HTTPS流量,分析App与服务器通信内容;结合Python Requests库模拟请求,配置特定请求头以绕过反爬机制。同时使用代理IP隐藏真实IP地址,确保抓取稳定。最终成功提取热榜标题、内容简介、链接等信息,为分析热点话题和用户趋势提供数据支持。此方法也可应用于其他Android App的数据采集,但需注意选择可靠的代理服务。
761 11
移动端数据抓取:Android App的TLS流量解密方案
|
消息中间件 缓存 小程序
婚恋交友相亲公众号app小程序系统源码「脱单神器」婚恋平台全套代码 - 支持快速二次开发
这是一套基于SpringBoot + Vue3开发的婚恋交友系统,支持微信公众号、Uniapp小程序和APP端。系统包含实名认证、智能匹配、视频相亲、会员体系等功能,适用于婚恋社交平台和相亲交友应用。后端采用SpringBoot 3.x与MyBatis-Plus,前端使用Vue3与Uniapp,支持快速部署和二次开发。适合技术团队或有经验的个人创业者使用。
1064 8
|
数据采集 监控 API
加密货币 Pump 监测刮刀工具开发原理及实现路径
开发Pump监测刮刀工具需综合运用高频数据采集、波动率建模、跨平台对冲三大核心技术,2025年的技术瓶颈已从基础数据获取转向超低延迟执行与合规适配。建议采用模块化开发策略,优先实现核心监控功能,再逐步接入AI决策与链上套利模块。代码示例需根据最新交易所API文档动态调整,并严格遵守所在地监管法规。
|
小程序 Java 关系型数据库
圈子系统公众号app小程序系统源码圈子系统带即时通讯 多级圈子系统源码 兴趣小组系统开源 私密圈子系统代码 会员制社区系统
本圈子系统解决方案提供即时通讯、多级圈子、兴趣小组、私密社区及会员制管理功能。支持开源与商业方案,推荐ThinkSNS+、EasyClub及OpenFire等系统,并提供前后端技术选型建议,助力快速搭建社交平台。
691 0
不封号的外卖抢单神器,美团抢单辅助器app,autojs版本源码
这个代码提供了基础框架,包含主循环、订单检测和点击功能。实际使用时需要根据美团骑手AP