gpt4 book ai didi

java - 使用 java 的 native 方法

转载 作者:搜寻专家 更新时间:2023-11-01 02:41:14 25 4
gpt4 key购买 nike

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

主.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 <jni.h>
#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 <jni.h>
#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<jni.h>
#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 为 native 方法生成 .h stub 时,它包括类的包和类名。这样您就可以在不同的类中使用相同的方法名称。

Java_Main_intMethod

需要重命名为

Java_troller_intMethod

如果类相同但包发生变化,您还必须更改方法名称。

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

关于java - 使用 java 的 native 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32724344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com