2

我正在帮助编写一个跨平台的定格动画程序,并且在 Windows 上效果很好。对于那些不知道的人来说,定格动画只是动画的一个花哨的术语。该程序允许用户将尼康、佳能和网络摄像头插入计算机,并让程序显示现场的实时视图,然后能够从那里手动控制相机。包括来自佳能的相机框架文件,其路径定义如图所示

import com.sun.jna.Native;
initialization and such

public static EdSdkLibrary EDSDK = (EdSdkLibrary) Native.loadLibrary("Macintosh/EDSDK.framework/EDSDK",EdSdkLibrary.class, options);

在“public static int ...”处抛出错误,表示找不到图像。我已经尝试过无数次重新定义路径、移动框架以及使用与我正在使用的框架相同的各种其他框架。请记住,这在 Windows 上完美运行,但在 Mac 上存在问题。

mac 上的框架是否不同,或者它们的定义不同?我已经查看并没有找到其他解决方案。

编辑:好的,我定义了路径,它现在有这个符号 > 旁边没有文字。现在我该怎么做?

编辑:这是说这个 % 不是命令。没有它,它仍然无法工作。

4

2 回答 2

3

JNA 将根据核心框架名称(本例中为 EDSDK)依次尝试从 ~/Library/Frameworks、/Library/Frameworks 和 /System/Library/Frameworks 加载框架。

如果loadLibrary调用成功,则找到该库。如果未找到该库,您将获得一个UnsatisfiedLinkError.

框架基本上是与其他资源共享库的捆绑;ESDK.framework/ESDK 是实际的共享库(对于框架,OSX 省略了通常在 OSX 上的共享库中找到的“dyld”后缀)。

编辑

以下是创建符号链接的方法,以便路径看起来更像 JNA 所期望的。从终端(运行 Terminal.app):

% ln -s /your/complete/path/to/Macintosh/EDSDK.framework ~/Library/Frameworks/EDSDK.framework

成功完成此操作后,您应该在列出 (ls) 符号链接时看到以下内容:

% ls -l ~/Library/Frameworks/EDSDK.framework
lrwxrwxr-x  1 YOU  YOU  50 Mar 31 01:13 /Users/YOU/Library/Frameworks/EDSDK.framework -> /your/complete/path/to/Macintosh/EDSDK/Framework/EDSDK.framework

您应该在左侧看到符号链接路径(JNA 将在其中查看),右侧是真实文件的路径。如果没有,请删除符号链接文件并重试。请注意,您可能需要先创建目录~/Library/Frameworks;它可能还不存在。

最后,确保您尝试加载的库与您尝试加载的 VM 匹配;64 位加 64 位,32 位加 32 位。佳能不提供其库的通用二进制文件,因此您需要指向其中一个或使用lipo.

于 2013-03-29T14:22:27.027 回答
0

不是真正的答案,而是关于我自己遇到的同一问题的更多信息。

我可以补充一点,如果 JNA 位于可执行文件查找其框架的标准公共位置之一,JNA找到我的框架,即

  • ~/Library/Frameworks- (供当前用户使用的公共框架)
  • /Library/Frameworks- (供任何用户使用的公共框架)
  • /System/Library/Frameworks- (公共系统框架)

但是,如果我希望我的自定义框架是私有的——即——除了我的 java vm 之外的其他进程无法发现——那么出于某种原因 JNA 不会这样做。

我知道 MacOS 动态加载器,在尝试为任何普通(本机)MacOS 进程查找库/框架时,不会开始搜索上述位置,而是首先在几个标准“私有”位置中搜索:(也称为rpath搜索路径)

  • 在与加载进程的二进制文件相同的位置的“框架”目录中:例如path/to/my/binary/Frameworks/mySDK.framework
  • 在动态加载程序加载进程的位置的“框架”目录中(在应用程序包中,这将是myApp.app/Contents/Frameworks/mySDK.framework文件夹。

因此,您通常可以在二进制文件旁边创建一个您自己的“框架”目录,并将您的框架放入其中。

但是 - JNA 错过了这一点。我试图在“Zulu”中创建一个“Frameworks”目录——在zulu-11.jre/Contents/Home/bin“java”二进制文件旁边和其他地方——但 JNA 在其中都找不到。

我想知道为什么,以及是否有任何文档。

在 /Library/Frameworks 中为我的自定义框架安装符号链接的技巧可能会为您服务,但我不能允许其他进程查找或加载我的框架。

于 2022-02-13T18:44:16.127 回答