针对各种处理器体系结构的本机库位置的最佳实践命名策略



在我的许多java项目中,有时我需要添加本机依赖项。每次我都想知道如何以经得起未来考验/可扩展的方式命名安装/提取位置。我观察了其他人是如何做到这一点的,但我看到各地都有不同的命名策略。

我知道这是一个主观的问题,但我仍然非常感谢你的意见。只要选择你想评论的任何方面。

我当前的列表(旨在进行中的工作):

lib/native/linux-x86/libtest.so
lib/native/linux-x64/libtest.so
lib/native/linux-armel/libtest.so
lib/native/linux-armhl-32bit/libtest.so
lib/native/linux-armhl-64bit/libtest.so (or will armhl libs be like mac dylibs and contain/cover both architectures?)
lib/native/macosx/libtest.dylib (looks like dylibs often contain both x86 and x64 architectures in one file)
lib/native/windows-x86/test.dll
lib/native/windows-x64/test.dll

这些事情我觉得很难决定:

  • 操作系统名称:win/windows,lin/linux,mac/macosx/osx
  • 处理器体系结构:IA-32/x86/i386/i586/i686、x86-64/x8_64/x64/amd64
  • 32位与64位:我知道这些信息在处理器体系结构旁边是多余的,但为了清晰起见,也许无论如何都应该包括它
  • armel/armhl:这个页面似乎表明64位ARM处理器与32位组件兼容?所以也许armhl真的没有必要区分32位和64位
  • mips、mipsel、powerpc、ppc、solaris、sparc、itanium/ia64/IA-64等在哪里适合这个方案
  • 我必须担心英特尔和AMD处理器之间的差异吗
  • 为什么很多人对macos(比如macosx)使用特定的名称,而对linux/windows标识符却不使用
  • 手机和平板电脑处理器呢?他们已经在这份名单中了吗

我对处理器体系结构的大部分"知识"都是从这个答案中获得的:https://unix.stackexchange.com/a/125314/109380

编辑:-2015-04-08:删除32/64位标识符,因为它们似乎是冗余的,将mac 32/64位变体压缩为一行,因为它们可以同时包含两种架构。

JNA对命名约定进行了两次修订。

第一个简单地基于Java为os.nameos.arch生成的操作系统系列/CPU架构对,并且松散地基于许多GNU软件使用的主机/目标三元组。在实践中,这些三元组只有OS和arch组件中的信息。

JVM生成的值实际上非常不一致,这导致了版本2。

操作系统系列linux、solaris、freebsd、netbsd、darwin(OSX)、android

CPU架构x86、x86_64、ppc、ppc64等

CPU拱形通常足以识别32位与64位。

至于ARM变体,我对此没有太多经验,但您确实需要区分本地库中的硬浮动和软浮动选项,并明确这一点。我认为把它嵌入"拱形"部分并不伤人。

如果你不打算在任何合理的时间内使用其他变体(mips/mipsel),我不会太担心。

powerpc=ppc(区分64位的ppc64)sunos=solaris(sparc/sparc64是sun硬件的拱门)itanium/ia64=你很可能只找到一种味道,ia64就足够了intel=amd(来自Java领域,你不太可能发现差异)

移动/平板电脑将主要是安卓系统或目前被称为windows移动的任何设备,通常带有ARM处理器。

"Darwin"是OSX的通用名称,多个体系结构可以捆绑在一个库中,因此通常不需要区分arch。

最新更新