
系统编程后端【免费下载链接】jnaJava Native Access项目地址https://gitcode.com/gh_mirrors/jn/jna点击查看免费下载本篇指南完整还原 Java Native AccessJNA项目在 FreeBSD 平台上构建原生库jnidispatch的官方操作步骤覆盖 aarch64、x86、x86-64 三个架构全部基于 FreeBSD 13.2-RELEASE 官方镜像与 QEMU 系统级模拟在 amd64 主机上完成。读者按本文操作即可在本地复现freebsd-aarch64.jar、freebsd-x86.jar、freebsd-x86-64.jar三类原生产物的构建并理解 JNA 是如何通过Platform识别 FreeBSD、由native/Makefile与 Ant 构建脚本完成编译与打包的底层机制。一、为什么需要为 FreeBSD 单独构建 JNA 原生库JNA 的运行时由两部分组成纯 Java 的 API 层com.sun.jna包和基于 libffi 的本地派发库libjnidispatch。不同操作系统、不同 CPU 架构需要各自编译一版原生共享库这正是仓库lib/native目录下存在大量{os}-{arch}.jar的原因。以 FreeBSD 为例仓库中预置了以下原生产物lib/native/freebsd-aarch64.jarlib/native/freebsd-x86.jarlib/native/freebsd-x86-64.jarlib/native/freebsd-ppc64.jarlib/native/freebsd-ppc64le.jar官方文档 www/FreeBSD.md 给出的做法并非传统的交叉编译而是在 amd64 Linux 主机上用 QEMU 全系统模拟启动真实 FreeBSD 虚拟机在虚拟机内部以原生方式编译从而避免交叉编译链配置的复杂性。三套配方aarch64、x86、x86-64的主体流程一致下载镜像 → 扩容 → 模拟启动 → 安装依赖 → 传输源码 → Ant 构建并跑单元测试 → 回传产物。二、aarch64在 amd64 主机上模拟构建 FreeBSD 原生库这是文档中标注为 This recipe was used to build the FreeBSD aarch64 native library on amd64 的正式配方完整命令如下# Fetch FreeBSD 13.2 image and extract it wget https://download.freebsd.org/releases/VM-IMAGES/13.2-RELEASE/aarch64/Latest/FreeBSD-13.2-RELEASE-arm64-aarch64.qcow2.xz xz -d FreeBSD-13.2-RELEASE-arm64-aarch64.qcow2.xz # Ensure there is enough space in the image qemu-img resize -f qcow2 FreeBSD-13.2-RELEASE-arm64-aarch64.qcow2 5G # Launch aarch64 emulator with downloaded image qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt \ -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin \ -serial telnet::4444,server -nographic \ -drive ifnone,fileFreeBSD-13.2-RELEASE-arm64-aarch64.qcow2,idhd0 \ -device virtio-blk-device,drivehd0 \ -device virtio-net-device,netdevnet0 \ -netdev user,idnet0 # Connect to terminal for emulated system and boot into single user mode with default shell telnet localhost 4444 # Resize partitions gpart show /dev/vtbd0 gpart recover /dev/vtbd0 gpart show /dev/vtbd0 gpart resize -i 3 /dev/vtbd0 growfs / # Exit single user mode (BSD boots to multi-user) exit # Login as root # Set current date and time (YYYYMMDDHHMM) date 202403081928 # Install prerequisites - part 1 - java, build system, rsync pkg install openjdk17 wget automake rsync gmake gcc bash texinfo # Adjust fstab (optional, only needed if reboot is planned) # fdesc /dev/fd fdescfs rw 0 0 # proc /proc procfs rw 0 0 # Install prerequisites - part 2 - ant wget https://dlcdn.apache.org/ant/binaries/apache-ant-1.10.14-bin.zip unzip apache-ant-1.10.14-bin.zip # Transfer JNA source code to build environment rsync -av --exclude.git USERBUILD_HOST:src/jnalib/ jnalib/ # Build JNA and run unittests cd jnalib chmod x native/libffi/configure native/libffi/install-sh /root/apache-ant-1.10.14/bin/ant # Copy jna native library back to host system scp lib/native/freebsd-aarch64.jar USERBUILD_HOST:src/jnalib/lib/native对该配方中各阶段做拆解说明镜像获取与解压下载 FreeBSD 13.2-RELEASE 的 aarch64 官方 qcow2 镜像用xz -d解压得到可直接被 QEMU 使用的磁盘镜像。磁盘扩容默认镜像磁盘空间偏小qemu-img resize 5G为镜像追加 5GB 容量避免后续pkg install与编译过程因磁盘写满而失败。QEMU 模拟器启动qemu-system-aarch64以-m 4096M分配 4GB 内存-cpu cortex-a57 -M virt使用 virt 虚拟板卡与 Cortex-A57 CPU 模型-bios指定 u-boot 引导固件串口经-serial telnet::4444,server -nographic导出到本机 4444 端口的 telnet 会话-nographic表示不启用图形窗口完全无头运行磁盘采用 virtio-blk网络采用-netdev userQEMU 用户态网络栈虚拟机可直接访问外网下载软件包。单用户模式分区扩容通过telnet localhost 4444连接虚拟终端引导进入单用户模式。gpart show /dev/vtbd0查看分区表gpart recover修正镜像调整后可能损坏的分区表gpart resize -i 3将第三个分区扩展到可用空间末尾最后growfs /扩大根文件系统。exit退出单用户模式后系统继续正常引导进入多用户模式。系统初始化以 root 登录后用date 202403081928设定正确时间格式为 YYYYMMDDHHMM避免证书校验与构建时间戳异常。安装依赖第一部分pkg install openjdk17 wget automake rsync gmake gcc bash texinfo。其中openjdk17提供构建与运行测试所需的 JDKautomake、gcc、texinfo用于生成与编译捆绑的 libffigmake是 GNU MakeFreeBSD 自带的 BSD make 无法正确处理 JNA 的 native/Makefilersync用于源码传输wget与bash服务于下载与脚本执行。文档同时以注释形式给出可选的 fstab 配置fdescfs 挂载到/dev/fd、procfs 挂载到/proc仅在计划重启虚拟机时才需要。安装 AntJNA 的主构建系统是 Apache Ant官方配方采用手工下载apache-ant-1.10.14-bin.zip并解压到/root下的方式相比 pkg 包能锁定版本。传输源码rsync -av --exclude.git USERBUILD_HOST:src/jnalib/ jnalib/从构建宿主机把仓库源码排除.git目录以减小体积同步进虚拟机。构建与测试进入源码根目录后先chmod x native/libffi/configure native/libffi/install-sh赋予脚本执行权限这是从 git 检出源码后最常见的问题随后直接运行/root/apache-ant-1.10.14/bin/ant。Ant 默认目标会先编译 Java 层、执行javah生成 JNI 头文件、编译原生 C 代码并打包成freebsd-aarch64.jar同时运行单元测试。回传产物scp lib/native/freebsd-aarch64.jar把构建出的原生 jar 传回宿主机源码树的lib/native目录供后续统一打包进jna.jar。三、x8632 位模拟构建 FreeBSD 原生库x86 配方整体与 aarch64 一致差异在于镜像、模拟器参数和磁盘设备名。完整命令如下# Fetch image wget https://download.freebsd.org/releases/VM-IMAGES/13.2-RELEASE/i386/Latest/FreeBSD-13.2-RELEASE-i386.qcow2.xz xz -d FreeBSD-13.2-RELEASE-i386.qcow2.xz # Ensure there is enough space in the image qemu-img resize -f qcow2 FreeBSD-13.2-RELEASE-i386.qcow2 5G # Launch image qemu-system-i386 -m 3096M -drive fileFreeBSD-13.2-RELEASE-i386.qcow2 gpart show /dev/ada0 gpart recover /dev/ada0 gpart show /dev/ada0 gpart resize -i 4 /dev/ada0 growfs / # Exit single user mode (BSD boots to multi-user) exit # Login as root # Set keyboard configuration kbdmap # Set current date and time (YYYYMMDDHHMM) date 202403081928 # Install prerequisites - part 1 - java, build system, rsync pkg install openjdk17 wget automake rsync gmake gcc bash texinfo # Adjust fstab (optional, only needed if reboot is planned) # fdesc /dev/fd fdescfs rw 0 0 # proc /proc procfs rw 0 0 # Install prerequisites - part 2 - ant wget https://dlcdn.apache.org/ant/binaries/apache-ant-1.10.14-bin.zip unzip apache-ant-1.10.14-bin.zip # Transfer JNA source code to build environment rsync -av --exclude.git USERBUILD_HOST:src/jnalib/ jnalib/ # Build JNA and run unittests cd jnalib chmod x native/libffi/configure native/libffi/install-sh /root/apache-ant-1.10.14/bin/ant # Copy jna native library back to host system scp lib/native/freebsd-x86.jar USERBUILD_HOST:src/jnalib/lib/native与 aarch64 配方相比需要留意的差异点模拟器改用qemu-system-i386 -m 3096M -drive file...使用 i386 平台默认的磁盘控制器无需-bios与 virtio 设备配置命令更简。磁盘设备名aarch64 下为/dev/vtbd0virtio-blki386 下为/dev/ada0AHCI/SATA。因此分区扩容需针对ada0操作且分区号是-i 4而非 aarch64 的-i 3——分区号必须与镜像实际分区布局一致不能照搬。键盘布局多用户引导后先执行kbdmap配置键盘布局在串口交互环境中一般直接确认默认值即可。产物名称最终回传的是freebsd-x86.jar。四、x86-64amd64模拟构建 FreeBSD 原生库x86-64 配方在流程上与 x86 完全平行仅镜像、模拟器、产物名不同。完整命令如下# Fetch image wget https://download.freebsd.org/releases/VM-IMAGES/13.2-RELEASE/amd64/Latest/FreeBSD-13.2-RELEASE-amd64.qcow2.xz xz -d FreeBSD-13.2-RELEASE-amd64.qcow2.xz # Ensure there is enough space in the image qemu-img resize -f qcow2 FreeBSD-13.2-RELEASE-amd64.qcow2 5G # Launch image qemu-system-amd64 -m 4096M -drive fileFreeBSD-13.2-RELEASE-amd64.qcow2 gpart show /dev/ada0 gpart recover /dev/ada0 gpart show /dev/ada0 gpart resize -i 4 /dev/ada0 growfs / # Exit single user mode (BSD boots to multi-user) exit # Login as root # Set keyboard configuration kbdmap # Set current date and time (YYYYMMDDHHMM) date 202403081928 # Install prerequisites - part 1 - java, build system, rsync pkg install openjdk17 wget automake rsync gmake gcc bash texinfo # Adjust fstab (optional, only needed if reboot is planned) # fdesc /dev/fd fdescfs rw 0 0 # proc /proc procfs rw 0 0 # Install prerequisites - part 2 - ant wget https://dlcdn.apache.org/ant/binaries/apache-ant-1.10.14-bin.zip unzip apache-ant-1.10.14-bin.zip # Transfer JNA source code to build environment rsync -av --exclude.git USERBUILD_HOST:src/jnalib/ jnalib/ # Build JNA and run unittests cd jnalib chmod x native/libffi/configure native/libffi/install-sh /root/apache-ant-1.10.14/bin/ant # Copy jna native library back to host system scp lib/native/freebsd-x86-64.jar USERBUILD_HOST:src/jnalib/lib/nativex86-64 与 x86 的关键区别仅在镜像下载地址amd64目录与模拟器qemu-system-amd64 -m 4096M。gpart操作对象同为ada0、分区号同为-i 4最终回传产物为freebsd-x86-64.jar。实际应用场景中amd64 是 FreeBSD 服务器的主流架构这一配方也被用于产出发行版内默认加载的原生库。五、源码视角JNA 如何识别与编译 FreeBSD 平台三套配方最终都会在ant阶段触发同一套平台适配逻辑理解它们有助于在真实 FreeBSD 主机上调试构建。5.1 平台识别Platform.FREEBSDJNA 用 src/com/sun/jna/Platform.java 统一做运行时平台判定Platform.FREEBSD 4、Platform.KFREEBSD 10分别对应 FreeBSD 与 Debian 的 GNU/kFreeBSD 内核通过System.getProperty(os.name)以startsWith(FreeBSD)判定系统类型提供isFreeBSD()便捷判断方法在计算原生库资源路径时case Platform.FREEBSD: osPrefix freebsd- arch;即运行时会在 classpath 中寻找com/sun/jna/freebsd-{arch}/前缀下的libjnidispatch.so这也解释了为何构建产物 jar 必须按freebsd-aarch64、freebsd-x86、freebsd-x86-64命名。5.2 构建系统native/Makefile 的 bsd 分支native/Makefile 中uname输出被归一化FreeBSD→freebsd、GNU/kFreeBSD→kfreebsd。随后所有 BSD 系freebsd、netbsd、openbsd、dragonfly、kfreebsd共享一个编译分支ifneq (,$(or $(findstring bsd,$(OS)),$(findstring dragonfly,$(OS)))) ARCH$(shell uname -m | sed s/i.86/i386/g) PCFLAGS-fPIC # X11 headers locate in /usr/local/include on FreeBSD and DragonFly CINCLUDES-I/usr/local/include -I/usr/X11R7/include -I/usr/X11R6/include CINCLUDES$(X11INC) LDFLAGS-o $ -shared CDEFINES-DHAVE_PROTECTION -DFFI_MMAP_EXEC_WRIT -DUSE_DEAFULT_LIBNAME_ENCODING endif该分支的要点-fPIC生成位置无关代码是共享库.so的标准要求X11 头文件路径FreeBSD 与 DragonFly 的 X11 头位于/usr/local/includeNetBSD 在/usr/X11R7/includeOpenBSD 在/usr/X11R6/include因此 Makefile 一次性把这些路径全部加入 include 搜索路径并允许通过X11INC变量追加JNA 的 Java 层需要访问 X11 以便在非 Windows/macOS 系统上支持 X11 相关调用HAVE_PROTECTION启用 VM 崩溃保护机制基于 POSIX 信号见 native/protect.h官方仅在测试过的平台启用FreeBSD 在支持列表内FFI_MMAP_EXEC_WRIT允许 libffi 通过 mmap 申请可写可执行内存以生成动态跳板代码USE_DEAFULT_LIBNAME_ENCODING按平台默认编码处理原生库文件名。此外64 位架构通过ARCHamd64时追加CC -m64、LD -m64处理libffi 默认以静态方式编译进jnidispatchFFI_CONFIG--enable-static --disable-shared --with-picyes以规避宿主系统 libffi 版本差异带来的 ABI 兼容问题。5.3 Ant 集成native/build.xml 的 os.prefix 判定native/build.xml 负责把 Ant 属性映射到 Makefile 参数os.prefix由os nameFreeBSD/判定为freebsd-${jre.arch}在 FreeBSD 上 make 程序固定选用gmakeos nameFreeBSD/→makegmake因为 native/Makefile 大量使用 GNU make 语法通过ARCH属性-aarch64$、-x86-64$、-x86$等正则匹配把目标架构传给 Makefile构建前先执行javah生成com.sun.jna.Function、com.sun.jna.Native等类的 JNI 头文件再调用 make 编译产物落到build/native-freebsd-*目录。5.4 统一打包freebsd-*.jar 如何进入 jna.jar根目录 build.xml 中的打包任务将各平台 jar 以zipfileset形式合并进最终jna.jarFreeBSD 相关条目包括zipfileset src${lib.native}/freebsd-x86.jar includes*jnidispatch* prefixcom/sun/jna/freebsd-x86/ zipfileset src${lib.native}/freebsd-x86-64.jar includes*jnidispatch* prefixcom/sun/jna/freebsd-x86-64/ zipfileset src${lib.native}/freebsd-aarch64.jar includes*jnidispatch* prefixcom/sun/jna/freebsd-aarch64/ zipfileset src${lib.native}/freebsd-ppc64le.jar includes*jnidispatch* prefixcom/sun/jna/freebsd-ppc64le/ zipfileset src${lib.native}/freebsd-ppc64.jar includes*jnidispatch* prefixcom/sun/jna/freebsd-ppc64/即每个 jar 内jnidispatch共享库被放入与Platform.osPrefix严格对应的 classpath 前缀保证运行时按freebsd-{arch}精确加载。这也意味着如果新增一个 FreeBSD 架构需要同时修改 src/com/sun/jna/Platform.java若有架构映射需求、native/build.xmlos.prefix/ARCH 判定、native/Makefile编译参数以及根目录 build.xml打包条目。六、构建验证与常见问题官方配方中/root/apache-ant-1.10.14/bin/ant默认即包含单元测试执行test目标测试源码位于 test/com/sun/jna例如 PlatformTest.java 会校验平台常量与名称映射。若需单独跑测试可在源码根目录执行ant testCI 参考配置见 .github/workflows/ci.yamlLinux/macOS 矩阵安装libtool automake libltdl-dev texinfo ant ant-optional等依赖后执行ant test与ant test-platform。按上述配方操作时以下几点最容易踩坑gpart 分区号差异aarch64 使用/dev/vtbd0 分区-i 3x86/x86-64 使用/dev/ada0 分区-i 4请严格按对应配方执行分区号错误会导致growfs失败。执行权限git 检出后native/libffi/configure与native/libffi/install-sh可能丢失可执行位必须在构建前chmod x否则 libffi 的 configure 阶段直接报错。GNU make必须安装并使用gmakeAnt 在 FreeBSD 上会自动选择 gmakeBSD make 无法解析 native/Makefile 中的 GNU 语法。fstab 与重启文档注释中的 fdescfs/procfs 配置仅在计划重启虚拟机时必要单次构建无需处理。系统时间虚拟机关闭自动校时后date时间错误可能导致 TLS 下载失败或构建时间戳异常务必按date 202403081928YYYYMMDDHHMM格式设定。网络QEMU 的-netdev user提供 NAT 网络虚拟机内wget、pkg install、rsync均可直连外网若构建机处于受限网络可先缓存依赖包再传入虚拟机。七、总结FreeBSD 的 JNA 原生库构建遵循QEMU 全系统模拟 原生编译的路径三套配方共享同一套环境准备镜像、扩容、单用户分区调整、依赖安装、Ant 构建仅在模拟器参数、磁盘设备名、分区号与产物文件名上存在架构差异。产物freebsd-{arch}.jar回传至 lib/native 后由 build.xml 合并进jna.jar最终经 src/com/sun/jna/Platform.java 的osPrefix机制在运行时按freebsd-{arch}前缀完成加载。掌握这套流程即可在任意 amd64 Linux 主机上为 FreeBSD 的 aarch64、x86、x86-64 甚至 ppc64/ppc64le 架构产出可用的 JNA 原生库。赞分享系统编程后端【免费下载链接】jnaJava Native Access项目地址https://gitcode.com/gh_mirrors/jn/jna点击查看免费下载相关推荐如何用 Paperless-ngx 标签系统让 2000 份乱文档 30 秒被找到如何用 Paperless ngx 标签系统让 2000 份乱文档 30 秒被找到 凌晨十二点你瘫在椅子上面前的文件夹像刚被抢劫过——上个月的发票、三年后端前端全文检索OCR知识管理JNA 原生库jnidispatch/libffi跨平台构建完全指南JNA 原生库jnidispatch/libffi跨平台构建完全指南 JNAJava Native Access的核心是一个名为 jnidispatch系统编程后端终极指南如何使用OpenCore Legacy Patcher免费让老款Mac重获新生终极指南如何使用OpenCore Legacy Patcher免费让老款Mac重获新生 OpenCore Legacy Patcher是一款革命性的开源工具操作系统固件驱动开发上一篇Flux1-dev FP8 模型完整实战指南24GB 显存以内流畅运行 ComfyUI下一篇Apache MXNet模型训练数据管理最佳实践版本控制与质量保证创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考