带有JNI和c的java.lang.UnsatisfiedLinkError

时间:2013-02-26 13:41:28

标签: java c java-native-interface

我见过很多JNI应用程序的例子。我自己尝试了一个并获得异常

dileepvikram@dileepvikram-System-Product-Name:~/include$ java -Djava.Library.path=. Test
Exception in thread "main" java.lang.UnsatisfiedLinkError: no Test in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at Test.<clinit>(Test.java:9)
Could not find the main class: Test.  Program will exit.

Test.java

 public class Test {
   public native void sayHello(int length) ;
   public static void main (String args[]) {
   String str = "I am a good boy" ;
   Test h = new Test () ;
   h.sayHello (str.length() ) ;
  }
  static {
    System.loadLibrary ( "Test" ) ;
  }
 }

我编译了他的代码并用代码

创建了一个Test.h
javah -jni Test

TEST.C

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


JNIEXPORT void JNICALL Java_hello_sayHello
  (JNIEnv *env, jobject object, jint len) {
  printf ( "\nLength is %d", len ); }
void main()
{
    printf("\nHello World\n");

}

然后我用命令

编译了c代码
gcc Test.c -o libTest.so

然后尝试使用命令

运行java类
java -Djava.library.path=. Test

我得到了例外

dileepvikram@dileepvikram-System-Product-Name:~/include$ java -Djava.Library.path=. Test
Exception in thread "main" java.lang.UnsatisfiedLinkError: no Test in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at Test.<clinit>(Test.java:9)
Could not find the main class: Test.  Program will exit.

我已经尝试了很多,找到问题,感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

首先,您的班级名为Test,而不是hello。所以你的功能应该是:

JNIEXPORT void JNICALL Java_Test_sayHello(JNIEnv *env, jobject object, jint length)

此外,在编译源代码时,使用-shared-fPIC让gcc编译共享对象(而不是可执行文件):

gcc Test.c -shared -fPIC -o libTest.so

作为共享对象进行编译也意味着您可以从main中删除Test.c函数,该函数不应该首先出现。

答案 1 :(得分:0)

.export LD_LIBRARY_PATH =。,从而设置当前目录的库路径,找到所需的Java文件。