java本地方法封装库_java高分局之實現本地方法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值