Android 动态调用SD卡内jar包

news2024/12/29 10:25:46

背景:jar包不放在项目路径,而是放在SD卡目录内,需要动态调用jar包内函数实现自己的业务逻辑。

全部流程

  1. 新建一个项目用来打包jar。

打包jar

定义接口,规范函数

定义实现类,实现方法,并实现函数的业务逻辑,供其他项目调用,注意 JarLoader 类的包名,后面会重点提到。

  1. 打包jar包,修改 build.gradle

//Copy类型
task makeJar(type: Copy) {
    //删除存在的
    delete 'build/libs/myjar.jar'
    //设置拷贝的文件
    // from('build/intermediates/bundles/release/')
    from('build/intermediates/aar_main_jar/release/')
    //打进jar包后的文件目录
    into('build/libs/')
    //将classes.jar放入build/libs/目录下
    //include ,exclude参数来设置过滤
    //(我们只关心classes.jar这个文件)
    include('classes.jar')
    //重命名
    rename ('classes.jar', 'myjar.jar')
}

makeJar.dependsOn(build)
//在终端执行生成JAR包
// gradlew makeJar

删除 MainActivity.class

执行打包命令:gradlew makeJar

打包完成

  1. 将my.jar 转为 mydex_jar.jar

将 my.jar 放在桌面文件夹中(自己随意放)

打开Android SDK,当前路径下打开 cmd,输入命令

dx --dex --output=mydex_jar.jar myjar.jar

记得将myjar.jar 路径替换,指定mydex_jar.jar输出路径

然后执行命令,得到Android 可以编译的 dex.jar

  1. 新建一个项目

将生成的 dex.jar 放在手机SD卡根目录。

将接口类 copy 过来,注意包名,和上面项目的包名一致,否则会报错类转换异常

新建一个 utils 类:LablePassUtils

package com.tky.phm.logic;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

import com.tky.phm.VApp;
import com.vondear.rxtool.RxFileTool;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.List;

import dalvik.system.DexClassLoader;

public class LablePassUtils {

    /**
     * 包名固定,类名固定
     * 方法名有接口实现
     */
    //https://www.freesion.com/article/8916963104/
    public static void getPass(Context context) {

        //拿到jar文件
        String sdCardPath = RxFileTool.getSDCardPath();
        List<File> files = RxFileTool.listFilesInDir(sdCardPath, false);
        File path = new File(sdCardPath + File.separator + "mydex_jar.jar");///storage/emulated/0/mydex_jar.jar
        DexClassLoader cl = new DexClassLoader(path.getAbsolutePath(), context.getFilesDir().getAbsolutePath(),
                context.getFilesDir().getAbsolutePath(), context.getClassLoader());
        Class myClass = null;
        try {
            // 载入JarLoader类, 并且通过反射构建JarLoader对象, 然后调用sayHi方法
            myClass = cl.loadClass("com.tky.phm.logic.JarLoader");  //这里要用类的完整名称
            ILoader loader = (ILoader) myClass.newInstance();
            //因为我们这里也有接口文件,所有就能直接点出方法来
            String hellow = loader.creatPass("1111");
            Log.e("hellow", hellow);
//            Toast.makeText(MainActivity.this, hellow + ",计算结果=" + result, Toast.LENGTH_SHORT).show();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

这样就能调用到SD卡内的 jar包内的函数了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据 | (一)Hadoop伪分布式安装

大数据原理与应用教材链接&#xff1a;大数据技术原理与应用电子课件-林子雨编著 Hadoop伪分布式安装借鉴文章&#xff1a;Hadoop伪分布式安装-比课本详细 大数据 | &#xff08;二&#xff09;SSH连接报错Permission denied&#xff1a;SSH连接报错Permission denied 哈喽&a…

社科院与杜兰大学金融管理硕士项目——人生没有太晚的开始,不要过早的放弃

经常听到有人问&#xff0c;“我都快40了&#xff0c;现在学车晚不晚呢”“现在考研晚不晚&#xff1f;”“学画画晚不晚&#xff1f;”提出这些疑问的人&#xff0c;往往存在拖延&#xff0c;想法只停留在想的阶段&#xff0c;从来不去行动。当看到周边行动起来的人开始享受成…

JAVA JDBC连接mysql数据库

什么是驱动&#xff1f;驱动是指计算机系统中的一种软件程序&#xff0c;它用于控制硬件设备的操作。每个硬件设备都需要与操作系统进行通信&#xff0c;而操作系统需要知道如何与每个设备进行通信&#xff0c;这就是驱动程序的作用。什么是jdbc&#xff1f;JDBC 是 Java 数据库…

java中的LinkedList和ArrayList的选择和区别

一、LinkedList LinkedList同时实现了List接口和Deque对口&#xff0c;也就是收它既可以看作一个顺序容器&#xff0c;又可以看作一个队列&#xff08;Queue&#xff09;&#xff0c;同时又可以看作一个栈&#xff08;stack&#xff09;&#xff0c;这样看来&#xff0c;linke…

操作系统面试题

操作系统一、简介篇1.解释一下什么是操作系统2.操作系统的主要功能3.软件访问硬件的几种方式4.操作系统的主要目的是什么5.为什么Linux系统下的应用程序不能直接在Windows下运行6.什么是用户态和内核态7.用户态和内核态如何切换8.什么是内核二、进程和线程篇1.多处理系统的优势…

Raft分布式共识算法学习笔记

1. Raft算法 Raft算法属于Multi-Paxos算法&#xff0c;它是在Multi-Paxos思想的基础上&#xff0c;做了一些简化和限制&#xff0c;比如增加了日志必须是连续的&#xff0c;只支持领导者、跟随者和候选人三种状态&#xff0c;在理解和算法实现上都相对容易许多 从本质上说&am…

HTML 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录前言HTML 结构快速生成代码框架HTML 常见标签注释标签标题标签: h1-h6段落标签&#xff1a;p换行标签&#xff1a;br格式化标签…

MySQL优化策略

1、 sql优化 1.1 SQL 语句简化&#xff0c;简化是 SQL 优化的一大利器&#xff0c;因为简单&#xff0c;所以优越。 1.2 尽可能避免或者杜绝多表复杂关联&#xff0c;大表关联是大表处理的噩梦&#xff0c;一旦打开了这个口子&#xff0c;越来越多的需求需要关联&#xff0c;…

HTTPS协议之SSL/TLS详解(下)

目录 前言&#xff1a; SSL/TLS详解 HTTP协议传输安全性分析 对称加密 非对称加密 证书 小结&#xff1a; 前言&#xff1a; 在网络世界中&#xff0c;存在着运营商劫持和一些黑客的攻击。如果明文传输数据是很危险的操作&#xff0c;因为我们不清楚中间传输过程中就被哪…

Spring从精通到入门

Spring1.spring了解2. Spring实现2.1 添加依赖2.2 Spring实现2.2.1 xml配置实现2.2.1.1 Bean标签属性1.spring了解 spring重要性 在当前的系统中&#xff0c;spring的重要性and占比性高达50%&#xff0c;无论是在ssm、ssh等框架中&#xff0c;spring始终屹立在前方&#xff0c;…

Postman创建Elasticsearch(2.4版本)索引

一、创建索引二、删除索引三、其他1、查看es信息2、查看索引test信息3、test索引下mapping查看4、elasticsearch 2.2.1下载一、创建索引 1、请求方式&#xff1a;PUT2、请求地址&#xff1a;地址 索引名3、请求数据 {"settings": {"number_of_shards": …

C语言offsetof(TYPE, MEMBER)全解

offsetof(TYPE, MEMBER) 是一个宏定义&#xff0c;用于计算一个结构体中某个成员的偏移量。 其第一个参数 TYPE 是一个结构体类型&#xff0c;第二个参数 MEMBER 是 TYPE 中的一个成员变量名。 它将返回类型为 size_t 的整数&#xff0c;表示 MEMBER 相对于 TYPE 起始地址的偏…

inode和逻辑块,目录的结构,挂载的实现 源码级分析linux内核的文件系统的结构

bitmap.c 位图相关 封装了set_bit clear_bit find_first_zero clear_block等操作位图的宏 对应i节点位图和逻辑块位图有对应的四个函数 free_inode, new_inode,free_block, new_block new_block 创建逻辑块 通过super_block找到逻辑块位图&#xff0c;给逻辑块位图的第一个…

Spring Boot中的bean注入方式和原理

Spring Boot是一个非常流行的Java框架&#xff0c;它可以帮助开发者快速地构建高效、健壮的应用程序。依赖注入是Spring Boo其中一个重要的功能&#xff0c;就是将一个对象注入到另一个对象中&#xff0c;以便它们可以相互协作。在Spring Boot中&#xff0c;依赖注入是通过bean…

Python如何获取大量电影影评,做可视化演示

前言 《保你平安》今天上映诶&#xff0c;有朋友看过吗&#xff0c;咋样啊 这是我最近比较想看的电影了&#xff0c;不过不知道这影评怎么样&#xff0c;上周末的点映应该是有蛮多人看的吧&#xff0c;可以采集采集评论看过的朋友发出来的评论&#xff0c;分析分析 这周刚好…

2023年斋月倒计时,跨境卖家该如何做好选品和营销?

2023年斋月即将到来&#xff0c;这是一个伊斯兰教徒们非常重要的节日&#xff0c;同时也是跨境卖家们迎接销售高峰的时期。在2023年的斋月期间&#xff0c;跨境卖家应该如何做好选品和营销呢&#xff1f;本文Nox聚星将和大家好好聊一聊。 根据2022年的数据&#xff0c;斋月期间…

【巨人的肩膀】MySQL面试总结(一)

&#x1f4aa; 目录&#x1f4aa;1、什么是ER图2、数据库范式了解吗3、超键、候选键、主键、外键分别是什么&#xff1f;4、为什么不推荐使用外键与级联5、什么是存储过程6、drop、delete与truncate区别7、数据库设计通常分为那几步8、什么是关系型数据库9、什么是SQL10、MySQL…

SpringBoot整合Redis实现高并发数据缓存

目录什么是缓存为什么要用缓存Redis为什么这么快实现一个用户信息的缓存方式一&#xff1a;利用RedisTemplate实现导入依赖添加配置添加redis工具类及配置类开发mapper接口service层controller层测试方式二&#xff1a;采用SpringBoot注解开启缓存在启动类添加EnableCaching注解…

旋转框目标检测mmrotate v1.0.0rc1 之RTMDet训练DOTA的官方问题解析整理(四)

关于rotated_rtmdet_l-coco_pretrain-3x-dota_ms.py配置文件的batchsize和学习率设置问题&#xff1a;回答&#xff1a;如何在mmrotate中绘制特征图问题&#xff1a;回答&#xff1a;你好AllieLan&#xff0c;您可以尝试使用https://github.com/open-mmlab/mmyolo/blob/main/de…

Java Class 加密工具 ClassFinal

Jar包加密工具 ClassFinal介绍环境依赖使用说明下载加密命令行示例maven插件方式无密码模式机器绑定启动加密后的jar启动参数给密码不加密码参数直接启动1. 密码文件获取2. 交互输入参考资料介绍 ClassFinal 是一款 java class 文件安全加密工具&#xff0c;支持直接加密jar包…