JNI UnsatisfiedLinkError 没有错误的方法名称并且指定了库路径

2023-12-31

我正在尝试按照本教程构建我的第一个 JNI 应用程序:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

问题摘要:运行应用程序时,出现 java.lang.UnsatisfiedLinkError 错误。

首先我写了这个类HelloJNI.java:

public class HelloJNI {
   static {
      System.loadLibrary("hello"); // Load native library at runtime
                                   // hello.dll (Windows) or libhello.so (Unixes)
   }

   // Declare a native method sayHello() that receives nothing and returns void
   private native void sayHello();

   // Test Driver
   public static void main(String[] args) {
      new HelloJNI().sayHello();  // invoke the native method
   }
}

我编译的这个类是:javac HelloJNI.java接下来我跑了javahHelloJNI这产生了以下文件HelloJNI.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

接下来我实现了HelloJNI.c:

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"

// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

最后我编译了c类:

  • gcc -I"/usr/lib/jvm/java-8-oracle/include" -I"/usr/lib/jvm/java-8-oracle/include/linux" -c -Wall -Werror -fpic HelloJNI.c
  • gcc -shared -o hello.so HelloJNI.o

这会生成文件 hello.so 和 HelloJNI.o。接下来我尝试运行代码:

  • java -Djava.library.path=.你好JNI 这会产生错误:

    线程“main”中出现异常 java.lang.UnsatisfiedLinkError:java.library.path 中没有 hello 在 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864) 在 java.lang.Runtime.loadLibrary0(Runtime.java:870) 在 java.lang.System.loadLibrary(System.java:1122) 在HelloJNI。(HelloJNI.java:3)

这似乎是互联网上最常见的 JNI 错误...我的方法名称似乎是正确的。我也跑了:

  • nm 你好.so | grep 说

这给了我:00000000000006b0T Java_HelloJNI_sayHello这似乎是正确的,即编译器没有添加额外的字符。我根本就没有任何可以尝试的想法。有什么建议么?

我的操作系统:Linux Mint 13,GCC 版本 4.7.3,java 版本 1.8.0_60

=========更新=============== 当我更换时System.loadLibrary("hello"); by System.load("/usr0/home/jkinable/workspace/javaIDEA/jnitest/hello.so");我的 HelloWorld 示例有效!但是,我不想使用绝对路径,所以我仍在寻找一种使用方法System.loadLibrary("hello");反而?有什么建议么?我也尝试过在不同的 Linux 系统上运行,但遇到了同样的问题。


事实证明,这个问题是由于unix/linux平台上的一些命名约定造成的!使用时: System.loadLibrary(“你好”); 该文件不应命名为 hello.so!相反,名称应该是libhello.so。在 Windows 上,使用 hello.dll。令我惊讶的是IBM的JNI教程中没有提到这个问题:http://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html http://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html

我不确定这个问题背后的合理性是什么。为什么要在文件系统上加载一个名为 libhello.so 的库“hello”(而不是 hello.so)?

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

JNI UnsatisfiedLinkError 没有错误的方法名称并且指定了库路径 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如

随机推荐

  • 如何更改 Jest 中模拟模块中函数的模拟实现

    我有一个看起来像这样的 utils 文件 utils js const getNextDate startDate gt moment startDate MMM Do YYYY startOf day add 10 days format
  • Jquery 附加内容 - 不可点击

    我有以下JQ 它基本上是添加一个小图标 允许在选择列表项时进行一些内联 编辑 但是 我无法使用 jquery 添加的内容 当我单击 JQ 添加的内容时 我什至无法将任何内容记录到控制台 我下面的代码有问题吗 我无法添加小提琴 因为我没有此列
  • 如何让WorkManager始终在后台运行

    我如何让 WorkManager 始终在后台运行 无论应用程序是否关闭 终止 打开 它都应该始终运行 我已经编码了doWork检查数据库中的更改并在数据库发生更改时发送通知的方法 因此 它应该始终在 bg 中运行以检查更改 那么我应该用什么
  • 在nodejs中使用for windows的forever模块

    我从以下链接下载了forever模块 https github com nodejitsu forever https github com nodejitsu forever 我提取了 zip 文件并将其放置在我的 node module
  • 可以将参数传递给 WPF 用户控件吗?

    可以将值或参数传递给 WPF 用户控件吗 我正在使用 MVVM 模式
  • 与迭代器创建的流的并行性

    在对流进行实验时 我遇到了以下我不太理解的行为 我从迭代器创建了一个并行流 我注意到它似乎没有表现出并行性 在下面的示例中 我在控制台上打印了两个并行流的计数器 一个是从迭代器创建的 另一个是从列表创建的 从列表创建的流表现出了我预期的行为
  • 无法将信号连接到另一个类中的插槽

    我有2节课 A 类和 B 类 我从 A 类发出信号 希望 B 类接收该信号 我正在按照以下方式做 在监听器文件中 Header File Class Listener public DDSDataReaderListener Some co
  • 实体框架“实体对象不能被 IEntityChangeTracker 的多个实例引用”

    我收到错误 实体对象不能被多个实例引用 IEntityChangeTracker 当尝试创建新实体并将其保存到数据库时 我了解该错误以及它通常是如何发生的 但在这种情况下 我所做的就是创建一个新实体并添加一些int在保存之前添加到它 而不是
  • UIImagePickerController:没有调用 didFinishPickingMediaWithInfo

    希望你们一切都好 想知道是否有人可以帮助我理解为什么 Xcode 不能很好地配合我 我已将代码分为以下几个部分 以便我可以从 UIImagePicker 中选择个人资料照片 作品 为 ImagePicker 和 NavigationCont
  • 类型引用在 MergedDictionary 上找不到名为“{clr-namespace:xxx}ClassName”的类型

    我收到了异常Type reference cannot find type named clr namespace Dashboard View DashBoardColors在运行时 我有一个带有我的颜色的静态类 namespace Da
  • mean( ,na.rm=TRUE) 仍然返回 NA

    我对 R 非常陌生 从 SPSS 转移过来 我在运行 Mavericks 的 Mac 上使用 RStudio 请用两个音节的单词回答我的问题 因为这是我第一次真正尝试类似的事情 我已经完成了一些基本教程 并且可以使所有示例数据都正常工作 我
  • React 中从右到左 (RTL) 支持

    在 React 应用程序中实现 RTL 支持的最佳方式是什么 有没有办法覆盖默认值 p and span 标签 组件 来添加 RTL 支持 这样我就不必重写我已经编写的组件来支持 RTL 例如 有一些全局变量window RTL 所以当设置
  • 如何扩展 Draft-js-emoji-plugin 的主题

    我只需要扩展几个 CSS 规则草稿 js emoji 插件 https github com draft js plugins draft js plugins 记录的方式是通过theme对象配置 const theme emojiSele
  • java.lang.NoClassDefFoundError: org/openqa/selenium/remote/internal/JsonToWebElementConverter

    我正在尝试运行appium的第一个程序 但出现下面提到的错误 我已经下载了最新的 selenium 4 jar 和 java client appium jars 仍然显示 noClassFoundException 任何帮助 将不胜感激
  • vis.js setOptions 更改网络节点上的颜色

    我正在使用 vis js 来显示网络节点 我正在解析 JSON 中的节点数据并将其存储在数组中 each jsonObj function i val var itemId val id var itemGroup val group va
  • 如何使用 Console.WriteLine() 多次打印相同的字符[重复]

    这个问题在这里已经有答案了 可能的重复 有没有一种简单的方法可以返回重复 X 次的字符串 https stackoverflow com questions 3754582 is there an easy way to return a
  • 按键冷却时间

    我正在开发水平 2D 无限跑步者的个人项目 我在跳跃机制上遇到问题 玩家可以按住跳跃按钮并在接触地面后立即跳跃 我想强迫玩家释放按钮才能再次跳跃 我想在他漂浮时制作相同的机制 在跳跃结束时 当玩家开始下落时 其 y 速度会减少几秒 我遵循单
  • 如何解决 .NET CF 异常“找不到 PInvoke DLL”?

    谨此献给所有 C 专家 我已经为此烦恼了一段时间了 尝试了网上的各种建议 但没有成功 该操作发生在 Windows Mobile 5 0 中 我有一个名为 MyDll dll 的 DLL 在 MyDll h 中我有 extern C dec
  • 事件跟踪不起作用

    我正在尝试使用以下脚本将 Google 的事件跟踪集成到我的应用程序中 我可以在 实时 选项卡中查看事件 但我无法在 内容 选项卡中看到事件 var gaq gaq gaq push setDomainName none gaq push
  • JNI UnsatisfiedLinkError 没有错误的方法名称并且指定了库路径

    我正在尝试按照本教程构建我的第一个 JNI 应用程序 https www3 ntu edu sg home ehchua programming java JavaNativeInterface html https www3 ntu ed