【问题标题】:How to install Java native development headers on OS X Lion如何在 OS X Lion 上安装 Java 原生开发头文件
【发布时间】:2012-03-31 01:18:45
【问题描述】:

我正在尝试构建一个 JNI 项目,但我似乎找不到 JNI 标头(例如jni.h)。我已经从https://developer.apple.com/downloads/ 安装了“Java for Mac OS X 10.7 Developer Package”。

各种在线资源建议标头应位于 /System/Library/Frameworks/JavaVM.framework/Headers/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/include 等位置,但我无法在任何地方找到它们 - 安装程序似乎没有创建它们。

我看到了其他 JDK 组件——例如,/System/Library/Frameworks/JavaVM.framework/Commands/javah——但没有看到 JNI 标头。有什么建议吗?


更新:technomage 指出 Apple 现在将 JDK 安装在 /Library/Java/JavaVirtualMachines 下,而 JNI 标头位于 /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/include/jni.h

但我仍然坚持我的实际目标,即为 LevelDB 构建 JNI 包装器(根据 github.com/fusesource/leveldbjni 上的说明)。为了将 Maven 指向正确的 JDK,我将 /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/bin 添加到我的 PATH 前面,并将 JAVA_HOME 设置为 /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home。经过一段时间后,Maven 现在失败了:

[INFO] --- maven-hawtjni-plugin:1.5:build (default) @ leveldbjni-osx ---  
[INFO] Extracting /Users/steve/leveldb/leveldbjni/leveldbjni/target/leveldbjni-99-master-SNAPSHOT-native-src.zip to /Users/steve/leveldb/leveldbjni/leveldbjni-osx/target/native-build-extracted  
[INFO] executing: /bin/sh -c ./configure --disable-ccache --prefix=/Users/steve/leveldb/leveldbjni/leveldbjni-osx/target/native-build/target --with-leveldb=/Users/steve/leveldb/leveldb --with-snappy=/Users/steve/leveldb/snappy-1.0.3 --with-universal --with-leveldb=/Users/steve/leveldb/leveldb --with-snappy=/Users/steve/leveldb/snappy-1.0.3  
...  
[INFO] configure: JAVA_HOME was set, checking to see if it's a JDK we can use...  
[INFO] checking if '/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home' is a JDK... no  
[INFO] configure: javac was on your path, checking to see if it's part of a JDK we can use...  
[INFO] checking if '/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home' is a JDK... no  
[INFO] configure: Taking a guess as to where your OS installs the JDK by default...  
[INFO] checking if '/System/Library/Frameworks/JavaVM.framework' is a JDK... no  
[INFO] configure: error: JDK not found. Please use the --with-jni-jdk option

我无法确定 Maven 正在查看什么来识别“我们可以使用的 JDK”?一些挖掘让我找到了http://www.arm4.org/trac/browser/branches/architecture/m4/jni.m4,它似乎在几个地方寻找jni.h并尝试编译它,但我不知道这个jni.m4是否与Maven有任何实际关系。我在 /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/include/ 中有 jni.h。

【问题讨论】:

  • jni.m4 可能与 OpenJDK(OSX 版本基于此)有关。检查 maven 是否已更新以考虑新的 OSX JDK 路径/版本,以及您的 maven 是否是最新的(macports 可能是更新它的最简单方法)。
  • 我从 macports 重新安装了 maven ......这让我走得更远,但随后构建在一系列找不到的头文件中死亡。经过进一步的挣扎,我最终得到了它。我认为剩下的最大问题是苹果已经移动了 SDKs 目录。我通过将 /Developer/SDKs 符号链接到 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs 来解决这个问题。感谢您的所有帮助!
  • 我听说过其他开发人员在 OSX 上迁移到 1.7 并遇到 JNI 标头丢失、符号链接不正确或通常混乱的问题。许多工具依赖于旧的框架布局(因为这是 Apple 推荐的方式),所以预计会发生一些变化,因为现在一切都必须适应 Oracle 版本。

标签: java java-native-interface osx-lion


【解决方案1】:

我知道这是一个旧线程,但这是我今天(3 月 14 日末)所做的,因此我可以构建一些需要 Java 标头的 Ruby GEM。我认为矫枉过正,但涵盖了所有基础。

  1. 从以下位置下载 Java 8 JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  2. 安装它。

  3. 看看 Oracle 把它放在哪里了:

    $/usr/libexec/java_home
    /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
    
  4. 从那里到 Apple 过去放置它的位置的符号链接:

    $cd /System/Library/Frameworks/JavaVM.framework/Versions
    $sudo ln -nsf /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents ./CurrentJDK
    
  5. 在 JavaVM.framewrk 中创建 Headers 目录的符号链接:

    $cd /System/Library/Frameworks/JavaVM.framework
    $sudo ln -nsf Versions/CurrentJDK/Home/include/ ./Headers
    

这为我解决了问题。我还没有定义JAVA_HOME,因为我不需要它。

【讨论】:

  • 这适用于构建一些使用 JNI 的 Hadoop 工具,谢谢!
  • 此符号链接似乎被 macOS 10.11 及更高版本阻止:(
  • 当。猜猜这些天您必须关闭系统完整性保护。呃。
【解决方案2】:

您可能需要安装 Java 文档包来获取标题;对于最近的几个版本,它们没有包含在 JDK 包中。安装后,它们会显示在 /System/Library/Frameworks/JavaVM.framework/Headers 中。

[edit] Apple 曾经将 JNI 标头与 JDK doc 包捆绑在一起。这已不再是这种情况; JNI 标头应该与 Java 开发人员包捆绑在一起。

【讨论】:

  • 谢谢...我四处寻找“Java 文档包”下载。我能找到的最接近的东西是 XCode 首选项中的“文档集”下的一个选项,用于下载“Mac OS X Java 库”。你指的是这个吗?它不会导致创建 Headers 目录。
  • 请注意,developer.apple.com/downloads 声明“Java for Mac OS X 10.7 Developer Package”(我最初下载的)包括“文档...和本机框架头文件”。我发现自己想知道该软件包是否根本没有正确安装。但是安装程序没有报告任何错误,我在安装程序日志中也没有看到任何可疑之处。
  • 它们可能会错误地从开发包中丢失;这以前发生过。向苹果 (bugreporter.apple.com) 报告他们缺少哪个包(2011 年 9 月 28 日或 2012 年 2 月 15 日)。如果您在任何一个包中都没有找到它们,则需要安装或从以前的包中复制——如果您安装了以前的 SDK,请查看 /Developer/SDKs/MacOSX10.*.sdk/System/库/Frameworks/JavaVM.framework/Versions/CurrentJDK/Headers/.
  • 有关最近打包更改的其他信息在这里,包括从文档包中移动标题 - developer.apple.com/library/mac/#releasenotes/Java/…
  • 顺便说一句,您可以运行“locate jni.h”来查看您的系统上是否安装了 any 头文件。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2012-03-23
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多