我正在构建一个API,该API通过C / C ++调用本机操作。我创建了一个JNI项目,并使用以下参数构建了jnilib

g++ -dynamiclib -rpath @loader_path -F /Users/nstuart/Downloads/myo-sdk -framework myo -framework JavaVM -o libmyo.jnilib *.o


我试图使我的API自成体系,因此所有库都在我的/ src / main / resources中,我只是将它们复制到临时目录,然后再设置java.library.path并从此处加载我的JNI库。我已经在Windows上运行了它,因为我只需要我的JNI DLL和另一个我也可以复制的DLL。

在Mac上尝试此操作时,遇到了以下问题:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /private/var/folders/sf/3_7c7p452dq9jt_39yx76cn55rd8xh/T/libmyo.jnilib: dlopen(/private/var/folders/sf/3_7c7p452dq9jt_39yx76cn55rd8xh/T/libmyo.jnilib, 1): Library not loaded: @rpath/myo.framework/Versions/A/myo
  Referenced from: /private/var/folders/sf/3_7c7p452dq9jt_39yx76cn55rd8xh/T/libmyo.jnilib
  Reason: image not found


我认为这是因为我的@rpath设置不正确,并且我想知道“正确”的设置方法。从Java的角度来看,@rpath在哪里?如果是相对的,或者在loader_path位置,那在哪里?我希望能够在运行时进行设置,以便可以复制库文件,然后指向该程序的位置。

在Java中,如何确定:@rpathloader_path?从哪里加载依赖框架?

最佳答案

@rpath的工作方式是每个可执行文件或库都用目录列表替换框架安装名称中的@rpath,以便在链接到框架时搜索该框架。您看到的错误是libmyo.jnilib找不到myo.framework,因为其运行路径设置为@loader_path,这意味着它将在myo.framework中查找/private/var/folders/sf/3_7c7p452dq9jt_39yx76cn55rd8xh/T/

据我所知,您在myo.framework中有/Users/nstuart/Downloads/myo-sdk
您可以通过调整运行路径或将myo.framework移至输出目录来解决此问题。

参考:Myo SDK Reference小节“终端”

07-28 05:54