依赖Jar包归一
Java软件包归一主要针对包含so的Jar包应用,将相关so二进制文件分路径存储,并在对应的Java文件中进行修改适配,最终生成的Jar包能同时运行在鲲鹏及x86平台下,做到Jar包归一。
处理步骤
Java提供了JNI(Java Native Interface)接口来调用native函数,但需单独编写JNI文件,即使用Java能够理解的C代码调用native函数,过程相对复杂。更便捷的方式可通过JNA(Java Native Access)框架,JNA提供了一个动态的转发器,可实现Java和C的数据类型映射,简化native函数的调用。只需将编译后的so文件置于JNA默认的架构平台关联路径下,通过JNA接口可快速实现不同架构平台下so库调用,实现Jar包依赖的归一。
示例:
以下示例代码通过构造一个包含libcrc32.so动态库的Jar包,进行Jar包依赖库归一,使其在鲲鹏及x86架构平台均能调用运行。
- 编译生成鲲鹏及x86动态库
编写以下crc32相关代码段,生成鲲鹏和x86平台的libcrc32.so文件。
// crc32.cpp文件 #include <stdint.h> extern "C" { #ifdef __x86_64__ uint32_t crc32_u8(uint32_t crc, uint8_t value) { __asm__("crc32b %1, %0" : "+r"(crc) : "rm"(value)); return crc; } #endif #ifdef __aarch64__ uint32_t crc32_u8(uint32_t crc, uint8_t value) { __asm__("crc32cb %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)); return crc; } #endif }
使用以下命令编译相应平台动态库:
gcc crc32.cpp -fPIC -shared -o libcrc32.so
鲲鹏处理器下需增加-march=armv8-a+crc编译选项。
- 基于JNA接口函数,生成jar包基于JNA相关接口函数,编写Clibrary.java文件 (需提前下载JNA jar包,建议5.1.0及以上版本),JNA会根据默认的架构平台目录寻找相应so文件(如:resources/linux-aarch64、resources/linux-x86-64路径,需提前在工程中创建该目录),再将已编译的so置于对应架构目录下即可,Clibrary.java文件内容如下:
package org.example; import com.sun.jna.Library; import com.sun.jna.Native; public interface Clibrary extends Library { Clibrary INSTANCE = Native.load("crc32", Clibrary.class); int crc32_u8(int crc, byte value); }
最终将Clibrary.java文件及相关so打包成jar包,即可在多平台下调用crc32_u8函数运行。部分相关文件组织结构如下:
├── java │ └── org │ └── example │ └──Clibrary.java └── resources ├── linux-aarch64 │ └── libcrc32.so └── linux-x86-64 └── libcrc32.so
父主题: 第三方依赖归一