linux中的jni(Cent6):线程“main”java.lang.UnsatisfiedLinkError中的异常

时间:2013-04-26 08:17:13

标签: linker java-native-interface centos

我现在正在与JNI合作。

我做了以下事情:

  1. 我制作了HelloJNI.java。它只是链接库libhello.so。

    static {
      System.loadLibrary("hello");
    }
    
  2. 像这样。当然我也有身体,但没什么特别的。

    1. 然后我制作了类文件,C文件和头文件。 我命令

      #javac HelloJNI.java
      #javah -classpath /usr/guest/workspace/path/ -jni package.HelloJNI
      no errors till now.
      
    2. 我制作了libhello.so。

      # gcc -shared -fpic -o libhello.so -I/usr/java/jdk1.7.0_21/include -I/usr/java/jdk1.7.0_21/include/linux HelloJNI.c
      
    3. 当我在eclipse中运行此项目时,错误如下所示。

      Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
          at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
          at java.lang.Runtime.loadLibrary0(Runtime.java:845)
          at java.lang.System.loadLibrary(System.java:1084)
          at org.owls.jni.HelloJNI.<clinit>(HelloJNI.java:7)
      
    4. 我试过这个,但是不行。

          # chcon -t texrel_shlib_t libhello.so
      

      感谢阅读和明智的解决方案:D

      • 有人谈论PATH的事情。但是我无法理解把这条线放到哪里。

2 个答案:

答案 0 :(得分:0)

export LD_LIBRARY_PATH="/path/to/library/"。您可以从命令行执行此操作,也可以将其添加到bashrc中 阅读http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.htmljni.h and expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’

的良好链接

答案 1 :(得分:0)

我自己解决了这个问题。

其原因是javah命令。

我确实喜欢以下。

javah -classpath /home/guest/workspace/.../src org.owls.HelloJNI.

生成的头文件中的方法与我的预期不同。

我期待像

这样的东西
JNIEXPORT JNICALL void Java_HelloJNI_say(JNIEnv* env, jobject j){}

但实际上是在下面生成的。

JNIEXPORT JNICALL void Java_org_owls_HelloJNI_say(JNIEnv* env, jobject j){}

这是我遇到问题的主要原因。

尽管我把自己扔了出去,但是非常感谢有分享我问题的人。

祝你有个美好的一天:D