不满意的链接错误:java.library.path中没有libhello
我正在做一个关于JNI的教程,以便在我的项目中熟悉它。然而,我仍停留在教程的这一部分,即运行Java程序。我正在使用Eclipse,在Eclipse中我创建了一个Java项目,并将文件放在一个包中。当我尝试在不使用Eclipse的情况下遵循教程时,我没有收到任何错误,因此我假设这是一个与路径相关的问题 至于我的错误,我得到了一个 不满意的链接错误:java.library.path中没有libhello 当我在终端中运行此命令时:不满意的链接错误:java.library.path中没有libhello,java,c,linux,eclipse,java-native-interface,Java,C,Linux,Eclipse,Java Native Interface,我正在做一个关于JNI的教程,以便在我的项目中熟悉它。然而,我仍停留在教程的这一部分,即运行Java程序。我正在使用Eclipse,在Eclipse中我创建了一个Java项目,并将文件放在一个包中。当我尝试在不使用Eclipse的情况下遵循教程时,我没有收到任何错误,因此我假设这是一个与路径相关的问题 至于我的错误,我得到了一个 不满意的链接错误:java.library.path中没有libhello 当我在终端中运行此命令时: java -Djava.library.path=. hello
java -Djava.library.path=. helloJNI.HelloJNI
javac -h . HelloJNI.java
即使我指定了路径,它也不起作用。如果你想重现我的步骤,下面是我所做的:
HelloJNI.java
后,我在终端中运行了以下操作:
java -Djava.library.path=. helloJNI.HelloJNI
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
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.c”
#包括//JDK提供的JNI头
#include//C标准IO头
#包括“helloJNI_helloJNI.h”//Generated
//本机方法sayHello()的实现
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv*env,jobject thisObj){
printf(“你好,世界!\n”);
返回;
}
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
/*不要编辑此文件-它是机器生成的*/
#包括
/*helloJNI_helloJNI类的标题*/
#如果没有,包括helloJNI和helloJNI
#定义(包括)helloJNI(包括)
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:helloJNI_helloJNI
*方法:你好
*签字:()五
*/
JNIEXPORT void JNICALL Java_helloJNI_helloJNI_sayHello
(JNIEnv*,jobject);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
我也尝试过设置工作目录的路径,但仍然得到相同的结果。我做错了什么
我向上移动了一个目录到~/eclipseworkspace/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
是的,我的libhello.so文件在helloJNI目录中。我试过你的建议。它似乎解决了这个问题,但我得到了一个不同的错误。现在它说:错误:找不到或加载主类HelloJNI,原因是:java.lang.ClassNotFoundException:HelloJNI不幸的是,即使有前缀,错误仍然存在。您应该在当前目录为
~/eclipse workspace/HelloJNI/src
时运行此命令,但是从~/eclipseworkspace/HelloJNI/src
运行命令会产生旧的错误。我还尝试通过添加我的工作区目录来编辑我的LD\u LIBRARY\u路径
,不过运气不好。嗨,我找到了答案。我忘了在C文件内的函数中添加包名。。。令人尴尬的无论如何,谢谢你的帮助。