在没有错误的方法名称和指定库路径的情况下,JNI出现 UnsatisfiedLinkError

 2023-01-20    291  

问题描述

我正在尝试构建本教程之后的第一个jni应用程序: https://www3.ntu.edu.sg/home/ehchua/programming/java/javanativeinterface.html

问题摘要:运行我的应用程序时,我会得到一个Java.lang.unsatisfiedlinkerror错误.

在没有错误的方法名称和指定库路径的情况下,JNI出现 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
接下来,我跑了 Javah Hellojni
这产生了以下文件 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/lib/jvm/java -8 -oracle/include/include/lineux” -c -wall -wall -wall -werror -fpiC hellojni.c
  • gcc -shared -o hello.so hellojni.o

这会产生文件hello.so和hellojni.o.接下来,我尝试运行代码:

  • java -djava.library.path =. hellojni
    这会产生错误:

    线程中的异常” main” java.lang.unsatisfiedlinkerror:no Hello in Java.library.path
    在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)

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

  • nm hello.so |格雷普说

这给了我: 00000000000006b0 t java_hellojni_sayhello 似乎是正确的,即编译器没有添加其他字符.我简单地完成了可以尝试的事情的想法.有任何建议吗?

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

===============================
当我替换System.loadLibrary(“hello”); System.load(“/usr0/home/jkinable/workspace/javaIDEA/jnitest/hello.so”);我的helloworld示例工作!但是,我不想使用绝对路径,所以我仍在寻找一种使用System.loadLibrary(“hello”);的方法?有什么建议么?我还尝试在其他Linux系统上运行,但是我遇到了同样的问题.

推荐答案

事实证明,问题是由于UNIX/Linux平台上的一些命名约定!使用时:
System.loadLibrary(” Hello”);
该文件不应命名为Hello.So!相反,该名称应为 libhello.o .在Windows上,使用Hello.dll.我感到惊讶的是,IBM的JNI教程中未提及这个问题: http://www.ibm.com/developererworks/java/tutorials/j-jni/j-jni.html

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

以上所述是小编给大家介绍的在没有错误的方法名称和指定库路径的情况下,JNI出现 UnsatisfiedLinkError,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26184.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。