中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

依赖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