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 没有错误的方法名称并且指定了库路径 的相关文章

随机推荐

  • 如何更改 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