java高分局之實現本地方法
什么是本地方法?
java中使用native修飾的方法就是本地方法。比如Thread類中的這個方法:
public static native Thread currentThread();
一個Native Method就是一個java調用非java代碼的接口,一般都是由C/C++實現。
為什么要使用本地方法?
java使用起來非常方便,然而有些層次的任務用java實現起來不容易,
或者我們對程序的效率很在意時,就需要用到本地方法。
JVM支持着java語言本身和運行時庫,它是java程序賴以生存的平台,
它由一個解釋器(解釋字節碼)和一些連接到本地代碼的庫組成。然而不管怎
樣,它畢竟不是一個完整的系統,它經常依賴於一些底層(underneath在下面的)系統的支持。
這些底層系統常常是強大的操作系統。通過使用本地方法,我們得以用java實現了jre的與底層系統的交互,
甚至JVM的一些部分就是用C寫的,還有,如果我們要使用一些java語言本身沒有提供封裝的操作系統的特性時,我們也需要使用本地方法。
自定義實現本地方法
代碼如下:public class MyNative {
static {
System.loadLibrary("MyNative");
}
public void showParms(String s, int i, boolean b) {
showParms0(s, i, b);
}
private native void showParms0(String s, int i, boolean b);
public static void main(String[] args) {
new MyNative().showParms("aaa",111,true);
}
}
通過javac MyNative.java 編譯java文件
然后通過javah -jni MyNative命令生成MyNative.h文件。內容如下:/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class MyNative */
#ifndef _Included_MyNative
#define _Included_MyNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MyNative
* Method: showParms0
* Signature: (Ljava/lang/String;IZ)V
*/
JNIEXPORT voidJNICALLJava_MyNative_showParms0
(JNIEnv *, jobject, jstring, jint, jboolean);
#ifdef __cplusplus
}
#endif
#endif
然后手動編寫MyNative.c文件,內容如下:#include
#include "MyNative.h"
JNIEXPORT void JNICALL Java_MyNative_showParms0
(JNIEnv *env, jobject obj, jstring s, jint i, jboolean b)
{
const char* szStr = (*env)->GetStringUTFChars( env, s, 0 );
printf( "String = [%s]\n", szStr );
printf( "int = %d\n", i );
printf( "boolean = %s\n", (b==JNI_TRUE ? "true" : "false") );
(*env)->ReleaseStringUTFChars( env, s, szStr );
}
然后執行命令:cl -I D:/java/jdk1.8.0/include -I D:/java/jdk1.8.0/include/win32 -LD MyNative.c -FeMyNative.dll,
需要安裝Visual C++ ,並且設置好環境變量后,才可以執行此命令。如果環境不對引起的錯誤,常見的就是一些*.dll文件找不到的錯誤,
你可以在visual C++或者jdk目錄下搜索,搜到后考到指定目錄就可以了。D:\>cl -I D:/java/jdk1.8.0/include -I D:/java/jdk1.8.0/include/win32 -LD MyNative.c -FeMyNative.dll
用於 80x86 的 Microsoft (R) 32 位 C/C++ 優化編譯器 16.00.30319.01 版
版權所有(C) Microsoft Corporation。保留所有權利。
MyNative.c
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
/dll
/implib:MyNative.lib
/out:MyNative.dll
MyNative.obj
正在創建庫 MyNative.lib 和對象 MyNative.exp
LIBCMT.lib(crt0init.obj) : warning LNK4254: 節“.CRT”(40000040)合並到具有不同特性的“.data”(C0000040)
就會生成幾個文件,其中有我們需要的MyNative.dll文件,其他不要的文件可以刪除。
最后使用:java MyNative 命令運行此class文件,就會看到運行結果:D:\>java MyNative
String = [aaa]
int = 111
boolean = true