1. 程式人生 > >Java筆記 #05# Java Native Interface

Java筆記 #05# Java Native Interface

code generate ner link vat cgo 實現 env tdi

未完待續,留著備用。。。。。

參考資料: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就行了。

Java筆記 #05# Java Native Interface