Java 创建和使用JNI库时出现问题
这是我的java lib文件: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[
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=…