如何加载具有依赖项的 JNI .dylib 文件而不出现 UnsatifiedLinkError?

2023-12-14

Goal:将 Java 链接到 Swift

Problem:我得到一个UnsatisfiedLinkError当尝试加载 JNI 时.dylib与 Swift 链接的文件.dylib调用时文件System#loadLibrary(String).

预期行为:Java的依赖.dylib将自动加载或调用System.loadLibrary("SwiftCode")将加载依赖项(我能想到的唯一解决方案)。

Note:我正在结合这个 github 教程 and 这篇中等文章创建我的 JNI.dylib文件和本教程创建我的 Swift.dylib file.

完整的堆栈跟踪:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /Users/hillmacbookpro/IdeaProjects/JavaToSwift/src/native/libSwiftHelloWorld.dylib: dlopen(/Users/hillmacbookpro/IdeaProjects/JavaToSwift/src/native/libSwiftHelloWorld.dylib, 1): Library not loaded: libSwiftCode.dylib
  Referenced from: /Users/hillmacbookpro/IdeaProjects/JavaToSwift/src/native/libSwiftHelloWorld.dylib
  Reason: image not found
    at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
    at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2408)
    at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2465)
    at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2662)
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2627)
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
    at java.base/java.lang.System.loadLibrary(System.java:1833)
    at helloworld.SwiftHelloWorld.<clinit>(SwiftHelloWorld.java:7)

文件结构:

src
  - helloworld
      - SwiftHelloWorld.java
  - native
      - libSwiftHelloWorld.dylib
      - libSwiftCode.dylib

MCVE:

SwiftHelloWorld.java:

package helloworld;

public class SwiftHelloWorld {

    static {
        System.loadLibrary("SwiftCode"); // loading SwiftHelloWorld's dependency first
        System.loadLibrary("SwiftHelloWorld"); // exception thrown here, can't find dependency?
    }

    public static native void printHelloWorldImpl();

    public static void main(final String[] args) {
        printHelloWorldImpl();
    }

}

libSwiftHelloWorld.dylib:使用这两个终端命令创建:

export JAVA_HOME="$(/usr/libexec/java_home -v 11)"; gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin/" -o libSwiftHelloWorld.dylib -dynamiclib helloworld_SwiftHelloWorld.c libSwiftCode.dylib

和这些文件:

  • helloworld_SwiftHelloWorld.c:

    #include <jni.h>
    #include <stdio.h>
    #include "helloworld_SwiftHelloWorld.h"
    #include "helloworld_SwiftHelloWorld_swift.h"
    
    JNIEXPORT void JNICALL Java_helloworld_SwiftHelloWorld_printHelloWorldImpl
      (JNIEnv *env, jclass clazz) {
    
        int result = swiftHelloWorld(42);
        printf("%s%i%s", "Hello World from JNI! ", result, "\n");
    
    }
    
  • helloworld_SwiftHelloWorld.h:自动生成的 JNI 标头javac -h native/ helloworld/SwiftHelloWorld.java

  • helloworld_SwiftHelloWorld_swift.h:

    int swiftHelloWorld(int);
    

libSwiftCode.dylib:创建使用swiftc SwiftCode.swift -emit-library -o libSwiftCode.dylibSwiftCode.swift file:

import Foundation

// force the function to have a name callable by the c code
@_silgen_name("swiftHelloWorld")
public func swiftHelloWorld(number: Int) -> Int {
    print("Hello world from Swift: \(number)")
    return 69
}

相关问题:

  • Java JNI链接多个库,他/她得到一个UnsatifiedLinkError但随着描述undefined symbol: ...(未答复)

  • 任何带有标签的东西JNI并含有UnsatifiedLinkError

其他注意事项:我将 Java 虚拟机的选项设置为-Djava.library.path=src/native,两者的父目录.dylib文件。我正在使用 macOS。

Edit:我已经尝试在命令之前进行编译SwiftCode.swift with xcrun如所见本文(在“编译 Swift 代码”下)但我仍然遇到相同的错误。


macOS ld将库依赖项的路径构建到二进制文件中。装载机装载libSwiftHelloWorld.dylib只会发现libSwiftCode.dylib如果后者位于当前目录中。在 Java 中加载依赖项不起作用,因为对于加载器来说它是一个不同的库。

您可以更改内置路径libSwiftCode.dylib-install_name论证(即swiftc ... -Xlinker -install_name -Xlinker <your path>)。如果你重建libSwiftHelloWorld.dylib之后它将引用您提供的路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何加载具有依赖项的 JNI .dylib 文件而不出现 UnsatifiedLinkError? 的相关文章

  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • 如何在 Swift 语言中传递错误指针?

    我试图在 swift 中传递错误指针 但无法这样做 编译器抱怨 NSError 无法转换为 NSErrorPointer var error NSError NSError var results context executeFetchR
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • C11可选功能宏在哪里?

    C11 标准中写道 编译器应该提供一些宏来测试可选功能的存在 我可以在哪些标题中找到它们 例如位于哪里 STDC NO VLA 对于 GCC 即 如果我尝试找到 STDC NO COMPLEX into complex h我在那里没找到 它
  • R - if 条件的子集数据

    如何使用逻辑条件对数据进行子集化 假设我有如下数据 我想对数据集进行子集化 第一个条件是所有动物都有 FCR 记录 然后我想将所有动物与新数据集中的这些动物放在同一个围栏中 animal Feed Litter Pen 1 0 2 5 3
  • Gearman:仍然没有办法从后台工作者检索自定义数据吗?

    首先 我知道this问题 Gearman 将数据从后台工作人员发送到客户端 我想知道 Gearman还是这样吗 我计划将一批图像 URL 从 PHP Web 应用程序发送到 gearman Worker 也是用 PHP 编写的 我们称之为
  • 使用 MVVM,每个 UI 窗口都有自己的 ViewModel 吗?

    当我在 MVVM 模式下设计多个视图时 每个视图是否都有自己的 ViewModel 还是它们都共享同一个 ViewModel 我知道这最终是一个灵活的决定 但最佳实践是什么 我的直觉告诉我每个视图 即每个单独的 UI 窗口 都有一个 Vie
  • 只让某些内部div控制外部div的宽度

    我有以下 html 结构 div div img src someimage path div div Some Text div div Some Text div div 容器是float left 容器将伸展到最宽的 div 但是如果
  • 为什么这个 VLA(可变长度数组)定义不可靠?

    为什么定义和使用 VLA 可变长度数组 的代码不能可靠地工作 include
  • 从基础组件导入找不到变量

    我创建了一个 BaseComponent 它将在所有其他组件中扩展 import React Component from react import ScrollView Text Image View TouchableOpacity T
  • libpcap - 从所有接口捕获数据包

    我需要从 Linux 机器上的所有网络接口捕获数据包 为了做到这一点 我计划使用pcap open live API 并传递 any 作为设备参数 我有不同类型的端口 以太网端口 例如 eth0 和 GRE 隧道 例如 tun0 来自不同类
  • npm start 不起作用 npm (错误!在 [email protected] 启动脚本处失败。)

    我正在使用示例link学习角度 但当我跑步时npm 启动它显示错误 我搜索了它要求更新 npm 或 Angular 版本的解决方案 但我已经在使用最新版本 如下所示 npm v 6 4 1 节点 v 10 9 0 角度 CLI 6 1 5
  • Microsoft Visual Studio:在Qt应用程序中加载资源(无插件)

    我们没有为 MSVS 安装 Qt 插件 这让我想知道如何 是否可以将资源 图像等 加载到应用程序中 是的 您可以加载资源 不幸的是 创建 qrc 文件的 qrc 编辑器是 Qt Addin for VS 的一部分 但是你可以手动创建这个xm
  • 如何为JTree单元设置透明背景?

    Folks 我正在尝试创建一个渐变 JTree 控件 除了树单元的背景不透明之外 以下代码大部分都可以工作 如果有人打电话告诉我我做错了什么 我将不胜感激 预先感谢您的帮助 问候 Peter package TestPackage impo
  • 不同持续时间输入的 FFMPEG amix 滤波器音量问题

    我注意到ffmpeg amix过滤器在特定情况下不会输出良好的结果 如果输入文件具有相同的持续时间 它就可以正常工作 在这种情况下 成交量会以恒定值下降 并且可以通过以下方式固定 volume 2 就我而言 我使用不同持续时间的文件 结果体
  • 批量重命名目录中的文件

    有没有一种简单的方法可以使用 Python 重命名目录中已包含的一组文件 Example 我有一个充满 doc 文件的目录 我想以一致的方式重命名它们 X doc gt 新 X doc Y doc gt 新 Y doc 我更喜欢为我必须做的
  • Flex 4 日期选择器

    我有很多日子 我希望那些日子在 DateChooser 组件中具有不同的背景颜色 例如红色 请问我该怎么做 DateChooser 的自定义并不那么容易 与此接近的东西会起作用 尽管您需要对其进行一些调整以适应您想要做的事情 public
  • 如何在 jQuery ajax 中从一个按钮调用多个 url?

    是否可以通过 jQuery 中的按钮调用两个 url 例如 我也想添加评论的内容 我该如何代表他们 ajax url ajax releaseBackEnd php url batch 2 release tmp php type POST
  • 如何在 JQuery 调用中使用变量

    我在尝试着 function doRow rowNum ajax url z html cache false success function html result rowNum append html 这似乎不起作用 当我做到这一点时
  • ng-transclude 内的 ng-model

    我使用时遇到问题ng model inside ng transclude As ng transclude创建子作用域 该值不能再设置为外部作用域 没有 ng transinclude 一切正常 text div div
  • 在 CardView 布局中运行媒体文件

    有没有办法获得媒体文件 audio video 运行在cardview布局 我想要一个videoa 内文件的预览card layout 当用户点击卡片时video audio全屏播放 就像 Facebook 的 feed 一样 为了获得这种
  • 如何在R中过滤数据?

    我有巨大的数据集 其中包含超过数百万行 并且具有一些特殊的属性 我需要过滤保留其其他属性的数据 我的数据如下 ID Prop1 Prop2 TotalProp 56891940 G02 G02 2 56892558 A61 G02 4 56
  • 如何加载具有依赖项的 JNI .dylib 文件而不出现 UnsatifiedLinkError?

    Goal 将 Java 链接到 Swift Problem 我得到一个UnsatisfiedLinkError当尝试加载 JNI 时 dylib与 Swift 链接的文件 dylib调用时文件System loadLibrary Strin