环境:
Ubuntu Server12.04
Hadoop1.2.1
gcc 4.6.3
JDK 1.7_51
hadoop@grc:~/jni$ gcc -fPIC -shared -o libMyJni.so MyJni.c -I. -I/home/hadoop/jdk1.7.0_51/include -I/home/hadoop/jdk1.7.0_51/include/linux
hadoop@grc:~/jni$ java TestJni
Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJni.print(Ljava/lang/String;)V
at TestJni.print(Native Method)
at TestJni.main(TestJni.java:8)
hadoop@grc:~/jni$ echo $LD_LIBRARY_PATH
.
hadoop@grc:~/jni$ java -Djava.library.path=. TestJni
Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJni.print(Ljava/lang/String;)V
at TestJni.print(Native Method)
at TestJni.main(TestJni.java:8)
问题如上,路径找到,编译没有问题,但是还是会报错。后来找到原因,
hadoop@grc:~/jni$ vim MyJni.c
图中红色框标志表示的意思是如果没有定义 _Included_TestJni就做里面的事,而_Included_TestJni在头文件MyJni.h 中已经出现了的,所以到 这个 C 文件里面 是已经定义过的,所以在C 文件里面是不会执行 这段宏定义里面的内容的,也就找不到方法了。解决方法是将红色框中的内容删除,再执行java TestJni即可成功。