未完待续,留着备用。。。。。
参考资料:http://www.ntu.edu.sg/home/ehchua/programming/java/javanativeinterface.html(很详细)
看jdk源代码时,经常会看到类似下面的代码:
private native int read0() throws IOException;
该类接口需要由c/c++实现。言下之意,该类方法的具体实现与特定操作系统密切相关。
1、尝试自己实现一个简单的native接口:
public class TestNativeMethod { public static native void sayHello(); static { System.loadLibrary("sayHello_impl"); } public static void main(String[] args) { sayHello(); } }
直接编译是ok的,不过没法正常运行:
mdzz@LAPTOP-QGECNCGO MINGW64 /d/lab2 $ javac TestNativeMethod.java mdzz@LAPTOP-QGECNCGO MINGW64 /d/lab2 $ java TestNativeMethod java.lang.UnsatisfiedLinkError: no sayHello_impl in java.library.path at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.loadLibrary0(Unknown Source) at java.lang.System.loadLibrary(Unknown Source) at TestNativeMethod.<clinit>(TestNativeMethod.java:6) Exception in thread "main"
2、通过javah -jni TestNativeMethod命令得到TestNativeMethod.h(c/c++版本的“接口”):
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class TestNativeMethod */ #ifndef _Included_TestNativeMethod #define _Included_TestNativeMethod #ifdef __cplusplus extern "C" { #endif /* * Class: TestNativeMethod * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_TestNativeMethod_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
3、书写相应的C/C++实现sayHello_impl.cpp:
#include "TestNativeMethod.h" #include <stdio.h> JNIEXPORT void JNICALL Java_TestNativeMethod_sayHello(JNIEnv *, jclass) { printf("Hello, this is a native method.\n"); }
4、这个时候编译cpp是100%报错的,你需要找到本地jdk文件夹内的两个.h文件:jni.h以及jni_md.h然后添加过去。。。。。。。然后设法将jni_md.h、sayHello_impl.cpp、TestNativeMethod.h、jni.h弄成一个sayHello_impl.ddl文件。
PS. 本人没弄成功,好不容易弄出ddl,运行程序时却报了32bit的ddl和64bit平台不兼容,更新mingw64老半天进度条又没动静,so。。。。。。。。。
5、最后再次运行TestNativeMethod就行了。