【Android】导入三方jar包/系统的framework.jar

1.Android.mk导包

1).jar包位置

与res和src同一级的libs中(没有就新建)
在这里插入图片描述

2).Android.mk文件

LOCAL_STATIC_ANDROID_LIBRARIES:android静态库,经常用于一些support的导包
在这里插入图片描述

LOCAL_JAVA_LIBRARIES:依赖的java库,一般为系统的jar包
在这里插入图片描述

LOCAL_STATIC_JAVA_LIBRARIES:指定依赖的静态库,三方jar包放在该处,后面为依赖的静态库别名,可以随便取名,但要和后面LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES对应
在这里插入图片描述

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES:表示依赖的静态库具体路径,zxing就是上面定义的别名
在这里插入图片描述

注:
代码混淆也需要修改
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
导包后如果不做处理,编译时会出现报错,根据具体的报错信息在proguard.flags文件中加规则

2.AS导包

1).正常导入

把jar包放到项目的libs文件下,右键选择添加为依赖库
在这里插入图片描述

2).正常导入但需要提升三方jar包优先级

有时候使用的jar包与sdk中同名,但需要优先使用三方jar包(此处更重要的是导入了系统的framework,优先使用framework.jar而找不到时的处理)
build.gradle(:app)

导入的jar包修改

compileOnly files('libs/framework.jar')

compileOnly 表示 jar 包只参与编译,不会打包进去

修改项目的build.gradle

有两种方式
1.相对路径

allprojects {
    gradle.projectsEvaluated {
        if (!plugins.hasPlugin("android-library") && !plugins.hasPlugin("android")) {
            return
        }
        //configure maven dependencies
        configurations.each { conf ->
            if (conf.name == 'compileOnly') {
                dependencies.add("compileOnly", files('app/libs/framework.jar'))
            }
        }
        //configure compile dependencies
        tasks.withType(JavaCompile) {
            Set<File> fileSet = options.bootstrapClasspath.getFiles()
            List<File> newFileList = new ArrayList<>();
            newFileList.add(files('app/libs/framework.jar'))
            newFileList.addAll(fileSet)
            options.bootstrapClasspath = files(newFileList.toArray())
        }
    }
}

2.绝对路径

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:E:\\AndroidProject\\Wifi\\app\\libs\\framework.jar')
        }
    }
}

此时,可以正常引用,有时候项目会出现提醒,但不影响正常运行、编译以及打包
在这里插入图片描述

Exception in thread "main" java.lang.ExceptionInInitializerError at net.openhft.chronicle.core.Jvm.getSetAccessible0Method(Jvm.java:228) at net.openhft.chronicle.core.Jvm.<clinit>(Jvm.java:129) at net.openhft.chronicle.map.ChronicleMapBuilder.<clinit>(ChronicleMapBuilder.java:165) at com.exmaple.graalvmchroniclemaptest.GraalvmchroniclemaptestApplication.main(GraalvmchroniclemaptestApplication.java:12) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:281) at org.springframework.boot.SpringApplicationAotProcessor.lambda$prepareApplicationContext$0(SpringApplicationAotProcessor.java:62) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) at org.springframework.boot.SpringApplicationAotProcessor$AotProcessorHook.run(SpringApplicationAotProcessor.java:109) at org.springframework.boot.SpringApplicationAotProcessor.prepareApplicationContext(SpringApplicationAotProcessor.java:60) at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:83) at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:49) at org.springframework.context.aot.AbstractAotProcessor.process(AbstractAotProcessor.java:83) at org.springframework.boot.SpringApplicationAotProcessor.main(SpringApplicationAotProcessor.java:80) Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at net.openhft.chronicle.core.Jvm.getSetAccessible0Method(Jvm.java:223) ... 18 more Caused by: java.lang.IllegalAccessException: module java.base does not open java.lang.reflect to unnamed module @363ee3a2 at java.base/java.lang.invoke.MethodHandles.privateLookupIn(MethodHandles.java:259) ... 23 more
最新发布
10-10
<think>我们正在处理一个Java异常问题,涉及ExceptionInInitializerError和IllegalAccessException,错误信息指出模块java.base没有将java.lang.reflect开放给未命名模块@363ee3a2。根据提供的引用,这个问题通常是由于Java模块系统的限制致的,特别是在使用反射访问内部API时。 从引用[2]和[3]中,我们看到类似的错误信息:`module java.base does not "opens java.lang" to unnamed module`,这意味着我们的代码(可能位于未命名模块中)试图通过反射访问java.base模块中未开放的。 引用[4]提供了一个解决方案:在启动时添加JVM参数来显式开放这些。具体来说,我们可以使用`--add-opens`选项。 针对当前错误信息`module java.base does not open java.lang.reflect to unnamed module @363ee3a2`,我们需要开放`java.lang.reflect`。因此,对应的JVM参数应该是: `--add-opens java.base/java.lang.reflect=ALL-UNNAMED` 另外,根据引用[3]中的错误,可能还需要开放其他,例如`java.lang`。所以,为了确保安全,我们可以同时添加多个`--add-opens`参数。 在Spring Boot应用中,我们可以通过以下方式添加JVM参数: 1. 如果是通过命令行启动,直接在`java`命令后添加这些参数。 2. 在IDE中运行,可以在运行配置的VM options里添加。 3. 如果是使用Maven或Gradle,可以在构建配置中设置。 例如,在IntelliJ IDEA中: - 打开运行配置(Run/Debug Configurations) - 在VM options栏中添加: ``` --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED ``` 另外,请注意,引用[3]中提到了`com.alibaba.excel`(EasyExcel)库,而我们的问题涉及ChronicleMap。这两个库都可能使用反射访问JDK内部类。因此,除了上述,可能还需要根据实际错误添加其他。 如果上述方法不能解决,我们需要检查是否还有其他需要开放。例如,如果错误信息中提到了其他,则需要为每个添加相应的`--add-opens`。 此外,我们还可以考虑升级相关库的版本,因为新版本可能已经适配了模块系统。 总结步骤: 1. 添加JVM参数:`--add-opens`开放所需的。 2. 确保使用的库(如ChronicleMap)是最新版本,因为新版本可能已经修复了与模块系统的兼容性问题。 3. 如果问题仍然存在,检查完整的堆栈跟踪,看是否有其他需要开放。 下面是一个示例的JVM参数设置: ``` --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED ``` 注意:在引用[4]中,他们添加了两个`--add-opens`参数,分别针对`java.lang`和`java.lang.reflect`。我们可以仿照这个做法。 但是,请注意,我们的错误信息中提到的是`java.lang.reflect`,所以至少需要开放这个。同时,由于错误链中可能还涉及其他(例如在引用[3]中同时需要`java.lang`),建议同时开放这两个。 另外,如果错误信息中提到了其他模块,也需要相应地开放。 最后,由于问题发生在Spring Boot应用中,我们需要确保将JVM参数传递给启动的Java进程。 如果是在Spring Boot的application.properties中,我们可以通过设置`JAVA_TOOL_OPTIONS`环境变量,但这并不是推荐的方式。更常见的做法是在启动脚本或IDE配置中直接设置。 因此,我们推荐在启动应用时直接传递JVM参数。 </think>针对 Java 程序中出现的 `ExceptionInInitializerError` 和 `IllegalAccessException` 错误,结合您提供的错误信息 `module java.base does not open java.lang.reflect to unnamed module @363ee3a2`,以下是完整的解决方案: ### 错误原因分析 1. **模块系统限制**:Java 9+ 的模块化系统默认禁止反射访问 JDK 内部 API(如 `java.lang.reflect`)[^2][^3] 2. **三方库冲突**:ChronicleMap 等库通过反射访问 JDK 内部 API,但未获得模块系统授权[^1][^3] 3. **未命名模块限制**:Spring Boot 将依赖打为未命名模块(`unnamed module`),无法访问受限[^2] ### 解决方案 #### 方法 1:添加 JVM 启动参数(推荐) 在应用启动命令中加入模块开放指令: ```bash java --add-opens java.base/java.lang.reflect=ALL-UNNAMED \ --add-opens java.base/java.lang=ALL-UNNAMED \ -jar your-application.jar ``` - `--add-opens` 显式开放指定给未命名模块 - 必须同时开放 `java.lang` 和 `java.lang.reflect` [^4] #### 方法 2:配置 Spring Boot Maven 插件 在 `pom.xml` 中配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments> --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED </jvmArguments> </configuration> </plugin> </plugins> </build> ``` #### 方法 3:升级依赖版本 检查并升级相关库版本: ```gradle // 对于 ChronicleMap implementation 'net.openhft:chronicle-map:3.23.1' // ≥3.22 已修复部分反射问题 // 对于 Spring Boot ext['spring-boot.version'] = '3.2.5' // ≥2.7.x 更好支持模块系统 ``` #### 方法 4:模块化改造(长期方案) 创建 `module-info.java`: ```java module your.module { requires spring.context; requires chronicle.map; opens com.yourpackage to spring.core; } ``` ### 验证步骤 1. 添加参数后启动应用 2. 检查日志确认无 `InaccessibleObjectException` 3. 使用 JDK 内置工具验证: ```bash java --list-modules | grep "java.base" ``` > **关键点**:必须同时开放 `java.lang` 和 `java.lang.reflect` 才能完全解决该异常[^4]。建议优先使用方法1并验证 ChronicleMap 的初始化流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值