JNI和c的java.lang.UnsatifiedLinkError
我已经看到了许多JNI应用程序的示例。我自己也试过一个,但有一个例外JNI和c的java.lang.UnsatifiedLinkError,java,c,java-native-interface,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(C
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.h
javah -jni 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");
}
然后尝试使用命令运行java类
gcc Test.c -o libTest.so
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.
dileepvikram@dileepvikram-系统产品名称:~/include$java-Djava.Library.path=。试验
线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有测试
位于java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
位于java.lang.Runtime.loadLibrary0(Runtime.java:823)
位于java.lang.System.loadLibrary(System.java:1028)
测试时。(Test.java:9)
找不到主类:Test。程序将退出。
我已经尝试了很多,为了找到问题,非常感谢您的帮助。首先,您的课程名为
Test
,而不是hello
。因此,您的功能应该是:
JNIEXPORT void JNICALL Java_Test_sayHello(JNIEnv *env, jobject object, jint length)
此外,在编译源代码时,使用-shared
和-fPIC
让gcc编译共享对象(而不是可执行文件):
作为共享对象编译还意味着您可以从
Test.c
中删除main
函数,该函数本来就不应该存在。.export LD\u LIBRARY\u PATH=,从而设置当前目录的库路径,即查找so的Java文件
JNIEXPORT void JNICALL Java_Test_sayHello(JNIEnv *env, jobject object, jint length)
gcc Test.c -shared -fPIC -o libTest.so