我正在编写有关JNI的教程,以使其适合我的项目。但是,我被困在运行Java程序的教程的这一特定部分。我在使用Eclipse的地方创建了Java项目,并将文件放在包中。当我尝试不使用Eclipse而按照本教程进行操作时,没有任何错误,因此我认为这是与路径相关的问题。
关于我的错误,我得到了
UnsatisfiedLinkError:java.library.path中没有libhello
当我在终端上运行此程序时
java -Djava.library.path=. helloJNI.HelloJNI
即使我指定了路径,它也不起作用。如果您想重现我的步骤,请按照以下步骤操作:
创建HelloJNI.java
后,我在终端中运行了以下命令:
javac -h . HelloJNI.java
此命令创建了下面给出的生成的头文件。
此后,我写了HelloJNI.c
,导航到package文件夹,然后使用以下命令在同一目录中对其进行编译:
gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.c
然后我将一个目录上移到~/eclipse-workspace/HelloJNI/src
并运行以下命令:
java -Djava.library.path=. HelloJNI
会产生上述错误。
这是我的代码:
HelloJNI.java
package helloJNI;
public class HelloJNI { // Save as HelloJNI.java
static {
System.loadLibrary("hello"); // Load native library hello.dll (Windows) or libhello.so (Unixes)
// at runtime
// This library contains a native method called sayHello()
}
// Declare an instance native method sayHello() which receives no parameter and returns void
private native void sayHello();
// Test Driver
public static void main(String[] args) {
new HelloJNI().sayHello(); // Create an instance and invoke the native method
}
}
HelloJNI.c
// Save as "HelloJNI.c"
#include <jni.h> // JNI header provided by JDK
#include <stdio.h> // C Standard IO Header
#include "helloJNI_HelloJNI.h" // Generated
// Implementation of the native method sayHello()
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
helloJNI_HelloJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class helloJNI_HelloJNI */
#ifndef _Included_helloJNI_HelloJNI
#define _Included_helloJNI_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: helloJNI_HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_helloJNI_HelloJNI_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
我也尝试过设置工作目录的路径,但仍然得到相同的结果。我在做什么错了?
答案 0 :(得分:0)
我将一个目录上移到
~/eclipse-workspace/HelloJNI/src
这意味着您的 libhello.so 在~/eclipse-workspace/HelloJNI/src/helloJNI
目录中,对吗?
现在,要让Java查找该库,请运行
java -Djava.library.path=helloJNI helloJNI.HelloJNI
或使用绝对路径
java -Djava.library.path=~/eclipse-workspace/HelloJNI/src/helloJNI helloJNI.HelloJNI