当前位置: 首页 > 知识库问答 >
问题:

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

秦渝
2023-03-14

在我的许多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位vs 64位:我知道这些信息在处理器架构旁边是多余的,但是为了清楚起见,也许应该包含这些信息?
  • armel/armhl:这个页面似乎表明64位ARM处理器与32位组件兼容?所以也许真的没有必要区分armhl的32位和64位?
  • mips、mipsel、power pc、ppc、solaris、spac、itania/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个答案

笪健
2023-03-14

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

第一个简单地根据Java为OS生成的内容生成OS系列/CPU架构对。名称和操作系统。arch,它松散地基于许多GNU软件使用的主机/目标三元组。实际上,这些三胞胎只在操作系统和arch组件中包含信息。

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

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

CPU Arch x86、x86_64、ppc、ppc64等。

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

至于ARM变体,我对这方面没有太多经验,但您确实需要在本机库中区分硬浮动选项和软浮动选项,并明确这一点。我认为把它嵌入“拱门”部分不会有什么坏处。

如果你不期望在任何合理的时间框架内使用它们,我不会太担心其他变体(mips/mipsel)。

Powerpc=ppc(ppc64区分64位)sunos=solaris(spac64是太阳硬件的拱门)itania/ia64=你可能只找到一种味道,ia64足够拱门英特尔=amd(从Java,你不太可能发现差异)

移动设备/平板电脑将主要采用Android系统或windows Mobile,通常采用ARM处理器。

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

 类似资料:
  • 我有带有本地化资源和x64本机依赖项的项目。有没有什么方法可以在没有警告的情况下建造它们? 如果我将目标平台设置为AnyCPU,由于本机引用,我会得到以下警告: 微软说这是一个错误,但他们不会修复它。 那现在怎么办?

  • 我已经阅读了所有关于日期操纵的问答,但似乎没有一个能给我一个满意的答案。 我有一个具有不同地域用户的项目,它在一些类和数据中使用。事情是,我正在寻找一种有效的方法来操作日期为不同的用户在他们各自的时区,大多数的答案建议使用Joda库的操作,这是很不理解,因为我仍然没有找到任何操作您不能做的传统Java,所以如果有人可以解释我可以做什么Joda不能做的传统Java,那么我可能会考虑使用它。 我最终找

  • 可以在Intellij(2019.1CE)Java项目中看到至少四个不同的位置来设置Java版本: d.文件设置构建、执行、部署编译器Java编译器目标字节码版本 除了在pom中设置目标和源之外,为什么需要额外的设置,每个设置做了什么其他设置不做的事情?谢谢

  • 问题内容: 我们正在使用构建大型Web应用程序。在不同情况下,我们经常使用自定义指令。当涉及到DOM操作,绑定事件等…发生时,我们在自定义指令的函数中定义了操作DOM的函数,但是我们从控制器调用了它(我们在因此它可以被给定的控制器访问)。我认为这样做的角度方法是为每个函数定义一个单独的自定义指令,并直接从模板中使用它,但是在我们的情况下,我不知道这样做会很方便很多自定义指令,所以BAD要做我们正在

  • 我有一个Web窗体网站项目。本网站引用了4个类库项目。这些类库中有3个引用第三方程序集。对于3个类库项目中的每一个,我都得到以下编译器错误。 我已经在类库项目上尝试了所有可能的anycpu/x86/x64组合。我不能在网站项目上更改此内容。我有x86和x64版本的第三方DLL。两者都试过。 “ClassLibrary.csproj”(默认目标)(4)->(ResolveAssemblyRefere

  • 决策结构要求程序员指定一个或多个要由程序进行评估或测试的条件,以及如果条件被确定为,则执行的语句或语句,以及可选地,如果 条件被确定为。 编号 条件结构 描述 1 if语句 第一个决策语句是语句。 2 if/else语句 下一个决策语句是语句。 3 嵌套if语句 有时候,要求有多个嵌套的语句。