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

时间:2015-04-07 15:52:50

标签: java java-native-interface native jna multiplatform

在我的许多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 / x86_64 / x64 / amd64?
  • 32位与64位:我知道这些信息在处理器架构旁边是冗余的,但为了清晰起见,它可能应该包括在内吗?
  • armel / armhl:This page似乎表明64位ARM处理器与32位组件兼容?那么也许真的没有必要为armhl区分32位和64位吗?
  • 像mips,mipsel,powerpc,ppc,solaris,sparc,itanium / ia64 / IA-64等这样的东西适合这个方案吗?
  • 我是否必须担心英特尔和AMD处理器之间的差异?
  • 为什么很多人使用mac os的特定名称(如macosx),而不是linux / windows标识符?
  • 手机和平板电脑处理器怎么样?它们是否已被此列表涵盖?

我的大部分知识"关于我从这个答案得到的处理器架构:https://unix.stackexchange.com/a/125314/109380

编辑: - 2015-04-08:删除了32/64位标识符,因为它们似乎是冗余的,将mac 32/64位变体折叠成一行,因为它们可以包含两种体系结构。

1 个答案:

答案 0 :(得分:1)

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

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

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

OS系列 linux,solaris,freebsd,netbsd,darwin(OSX),android

CPU Arch x86,x86_64,ppc,ppc64等。

CPU拱门通常足以识别32位和64位。

至于ARM变体,我没有多少经验,但你需要区分本机库中的hard和soft-float选项并明确说明。我不认为把它嵌入" arch"部分。

如果您没有预料到在任何合理的时间范围内使用它们,我不会过分担心其他变体(mips / mipsel)。

powerpc = ppc(ppc64区分64位) sunos = solaris(sparc / sparc64是太阳硬件的拱门) itanium / ia64 =你很有可能只找到一种这样的味道,ia64足以满足拱门的需求 intel = amd(来自Java-land,你不太可能发现差异)

移动/平板电脑将主要是Android或现在所谓的移动设备,通常使用ARM处理器。

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