Java 创建和使用JNI库时出现问题

Java 创建和使用JNI库时出现问题,java,java-native-interface,Java,Java Native Interface,这是我的java lib文件: HelloWorldJNI.java package hello; public class HelloWorldJNI { static { System.loadLibrary("native"); } public native void sayHello(); } import hello.HelloWorldJNI; public class Example{ public static void main(String[

这是我的java lib文件:

HelloWorldJNI.java

package hello;

public class HelloWorldJNI {
  static {
    System.loadLibrary("native");
  }

  public native void sayHello();
}
import hello.HelloWorldJNI;

public class Example{
  public static void main(String[] args) {
    new HelloWorldJNI().sayHello();
  }
}
相应的桥接头文件和cpp文件:

HelloWorldJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorldJNI */

#ifndef _Included_HelloWorldJNI
#define _Included_HelloWorldJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorldJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorldJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
目录结构如下所示:

|-hello
|     -HelloWorldJNI.java
|     -HelloWorldJNI.h
|     -HelloWorldJNI.cpp
使用以下方式编译:

g++ -c -fpic -I${JAVA_HOME}/include/ -I${JAVA_HOME}/include/linux hello/HelloWorldJNI.cpp -o HelloWorldJNI.o
g++ -shared -fpic -o libnative.so HelloWorldJNI.o -lc
javac -h . hello/HelloWorldJNI.java 
从hello目录中删除
.java
.cpp
.h
文件后:

jar cvf hello.jar ./hello
然后我们有一些类似于:

|-hello
|     -HelloWorldJNI.java
|     -HelloWorldJNI.h
|     -HelloWorldJNI.cpp
|hello.jar
|libnative.so
要测试库,请执行以下操作:

Example.java

package hello;

public class HelloWorldJNI {
  static {
    System.loadLibrary("native");
  }

  public native void sayHello();
}
import hello.HelloWorldJNI;

public class Example{
  public static void main(String[] args) {
    new HelloWorldJNI().sayHello();
  }
}
要编译并运行:

javac -cp "HelloWorldJNI.jar" Example.java
java -cp . -Djava.library.path=./ Example
但我得到了这个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: hello/HelloWorldJNI
    at Example.main(Example.java:5)
Caused by: java.lang.ClassNotFoundException: hello.HelloWorldJNI
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 1 more
相反,当我尝试:

java -cp "HelloWorldJNI.jar" -Djava.library.path=./ Example
java -cp ".;HelloWorldJNI.jar" -Djava.library.path=./ Example
我得到:

Error: Could not find or load main class Example
Caused by: java.lang.ClassNotFoundException: Example
当我尝试时:

java -cp "HelloWorldJNI.jar" -Djava.library.path=./ Example
java -cp ".;HelloWorldJNI.jar" -Djava.library.path=./ Example
我又明白了:

Error: Could not find or load main class Example
Caused by: java.lang.ClassNotFoundException: Example
我做错了什么


编辑:我在Ubuntu18.04 LTS上。

查看
hello.jar
,你会发现问题所在。(你可能知道),
ClassNotFoundException
意味着
示例
类不在你的类路径中。当您运行
java-cp.;HelloWorldJNI.jar“-Djava.library.path=。/示例
Example.class
是否存在于当前文件夹中?同时-您是否使用linux上的windows(或cygwin)?您是否为
-cp
使用了正确的分隔符?(
vs
)@Daniele I an on Ubuntu18.04 LTS。是的,我用错了分隔符。当前文件夹中存在Example.class。现在我得到java.lang.unsatifiedlinkerror。对于unsatifiedlinkerror,可以使用
export LD\u LIBRARY\u PATH=…