c代码 HelloWorld.c 如下
[C] 纯文本查看 复制代码 #include <jni.h>
void hello() {
printf("Hello from C!\n");
}
JNIEXPORT void JNICALL Java_MyClass_hello(JNIEnv *env, jobject obj) {
hello(); // 调用C函数
}
java代码 MyClass.java 如下
[Java] 纯文本查看 复制代码 public class MyClass { static {
System.loadLibrary("HelloWorld");
}
public native void hello();
public static void main(String[] args) {
MyClass m = new MyClass();
m.hello();
}
}
这个demo其实很简单,但是诡异的地方在于生成64位的dll并且用64位的jdk运行则一切都正常
但是如果生成32位的dll并且用32位的jdk则会报错,提示 Exception in thread "main" java.lang.UnsatisfiedLinkError: MyClass.hello()V
dll用mingw64的gcc 编译生成
64位dll编译命令是:gcc -shared "-I%JAVA_HOME%/include" -I"%JAVA_HOME%/include/win32" HelloWorld.c -o HelloWorld.dll
32位dll编译命令是:gcc -m32 -shared "-I%JAVA_HOME%/include" -I"%JAVA_HOME%/include/win32" HelloWorld.c -o HelloWorld.dll
|