0

我正在构建一个 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? 从哪里加载依赖框架?

4

2 回答 2

1

工作方式@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 参考小节“终端”

于 2014-12-09T17:08:26.647 回答
0

我为JavaCPP Presets工作。在我们链接的第三方库上,我们需要使用install_name_tool来更改任何构建过程@rpath(在 OpenCV 的情况下),如OpenCV 脚本中lib的这些行所示:cppbuild.sh

VER=${OPENCV_VERSION:0:3}
BADPATH=lib
LIBS="../lib/libtbb.dylib ../lib/libopencv_*.$VER.dylib"
for f in $LIBS; do install_name_tool $f -id @rpath/`basename $f` \
    -add_rpath /usr/local/lib/ -add_rpath /opt/local/lib/ -add_rpath @loader_path/. \
    -change libtbb.dylib @rpath/libtbb.dylib \
    -change $BADPATH/libopencv_core.$VER.dylib @rpath/libopencv_core.$VER.dylib \
    -change $BADPATH/libopencv_calib3d.$VER.dylib @rpath/libopencv_calib3d.$VER.dylib \
    -change $BADPATH/libopencv_features2d.$VER.dylib @rpath/libopencv_features2d.$VER.dylib \
    -change $BADPATH/libopencv_flann.$VER.dylib @rpath/libopencv_flann.$VER.dylib \
    -change $BADPATH/libopencv_gpu.$VER.dylib @rpath/libopencv_gpu.$VER.dylib \
    -change $BADPATH/libopencv_highgui.$VER.dylib @rpath/libopencv_highgui.$VER.dylib \
    -change $BADPATH/libopencv_imgproc.$VER.dylib @rpath/libopencv_imgproc.$VER.dylib \
    -change $BADPATH/libopencv_legacy.$VER.dylib @rpath/libopencv_legacy.$VER.dylib \
    -change $BADPATH/libopencv_ml.$VER.dylib @rpath/libopencv_ml.$VER.dylib \
    -change $BADPATH/libopencv_nonfree.$VER.dylib @rpath/libopencv_nonfree.$VER.dylib \
    -change $BADPATH/libopencv_objdetect.$VER.dylib @rpath/libopencv_objdetect.$VER.dylib \
    -change $BADPATH/libopencv_photo.$VER.dylib @rpath/libopencv_photo.$VER.dylib \
    -change $BADPATH/libopencv_video.$VER.dylib @rpath/libopencv_video.$VER.dylib; done
;;

要找到我们所拥有BADPATH的 myo,我们可以使用otool -L命令。修复框架库文件后,您需要重新构建libmyo.jnilib文件。

于 2014-10-19T03:42:48.143 回答