使用java的本机方法

我是java新手,当前正在学习本机方法,当我创建以下文件时:

Main.java

public class Main { public native int intMethod(int i); public static void main(String[] args) { System.loadLibrary("Main"); System.out.println(new Main().intMethod(2)); } } 

Main.c

 #include  #include "Main.h" JNIEXPORT jint JNICALL Java_Main_intMethod( JNIEnv *env, jobject obj, jint i) { return i * i; } 

编译并运行

 javac Main.java javah -jni Main gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \ -I${JAVA_HOME}/include/linux Main.c java -Djava.library.path=. Main 

输出

 4 

但是,当我这样做时:

troller.java :

 public class troller { public native int intMethod(int i); public static void main(String[] args) { System.loadLibrary("troller"); System.out.println(new troller().intMethod(2)); } } 

troller.c

 #include  #include "troller.h" JNIEXPORT jint JNICALL Java_Main_intMethod( JNIEnv *env, jobject obj, jint i) { return i * i; } 

编译并运行

 javac troller.java javah -jni troller gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \ -I${JAVA_HOME}/include/linux Main.c java -Djava.library.path=. troller 

输出

 Exception in thread "main" java.lang.UnsatisfiedLinkError: no troller in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) at java.lang.Runtime.loadLibrary0(Runtime.java:849) at java.lang.System.loadLibrary(System.java:1088) at troller.main(troller.java:4) 

如果我更改名称,为什么程序停止工作?

编辑 :看了答案后,我注意到某些不一致现在重新创建了所有文件,但错误仍然存​​在: Native.java

 public class Native{ public native int intMethod(int i); public static void main(String[] args){S System.loadLibrary("Native"); System.out.println("In java... :)"); System.out.println(new Native().intMethod(4)); } } 

Native.c

 #include #include"Native.h" JNIEXPORT jint JNICALL Java_Native_intMethod( JNIEnv *env, jobject obj, jint i){ printf("In C .... :)"); return i*i; } 

编译并运行

 javac Native.java javah -jni Native gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \ -I${JAVA_HOME}/include/linux Native.c java -Djava.library.path=. Native Exception in thread "main" java.lang.UnsatisfiedLinkError: no Native in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) at java.lang.Runtime.loadLibrary0(Runtime.java:849) at java.lang.System.loadLibrary(System.java:1088) at Native.main(Native.java:4) 

使用javah为本机方法生成.h存根时,它包含类的包和类名。 这样您就可以在不同的类中使用相同的方法名称。

 Java_Main_intMethod 

需要重命名为

 Java_troller_intMethod 

如果类相同但包更改,则还必须更改方法名称。

注意: C没有@Override ,您可以实现未在.h文件中声明的方法。 ;)

如果要将Main重命名为Troller,则需要始终如一地执行此操作。 但是您的本机库仍称为libMain.so。 因此,当您尝试加载库控制器时,它会失败,因为这是错误的名称。

由于您的C文件现在名为troller.c,因此您的gcc命令应该不起作用,或者您正在编译错误的文件。

我没有使用Java的本机方法,并试图猜测可能是什么问题。 在第二个遵守和运行命令

-I $ {JAVA_HOME} / include / linux Main.c

看起来它应该有troller.c而不是Main.c