---
title: 依赖Jar包归一
description: "Java软件包归一主要针对包含so的Jar包应用，将相关so二进制文件分路径存储，并在对应的Java文件中进行修改适配，最终生成的Jar包能同时运行在鲲鹏及x86平台下，做到Jar包归一。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0091.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0091.html
indexId: 895aa46a1a98ca4153300edf05c0f43acea7be0e3375c79cfed674c77eef4eb765
---
# 依赖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包(https://github.com/java-native-access/jna)
  ，建议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
```
