`

java的native使用方法

    博客分类:
  • Java
 
阅读更多
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。

------------------------------------------------------------------

编写带有native声明的方法的java类

·使用javac命令编译所编写的java类

·使用javah -jni java类名生成扩展名为h的头文件

·使用C/C++实现本地方法

·将C/C++编写的文件生成动态连接库

·ok

1) 编写java程序:这里以HelloWorld为例。

代码1:

class HelloWorld {

public native void displayHelloWorld();

static {

System.loadLibrary("hello");

}

public static void main(String[] args) {

new HelloWorld().displayHelloWorld();

}

}

声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为 native的,并且不能实现。其中方法的参数和返回值在后面讲述。 Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。

2)编译

没有什么好说的了 javac HelloWorld.java

3)生成扩展名为h的头文件

javah -jni HelloWorld

头文件的内容:/* DO NOT EDIT THIS FILE - it is machine generated */

1. include

/* Header for class HelloWorld */

1. ifndef _Included_HelloWorld 2. define _Included_HelloWorld 3. ifdef __cplusplus

extern "C" {

1. endif

/*

* Class: HelloWorld

* Method: displayHelloWorld

* Signature: ()V

* /

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);

1. ifdef __cplusplus

}

1. endif 2. endif(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。

4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。

代码2:

1 #include "jni.h" 2 #include "HelloWorld.h"

3 //#include other headers

4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)

{

printf("Hello world!\n");

return;

}

注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、 jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为 HelloWorldImp.c就ok了。

5)生成动态库

这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c 文件夹下面,使用VC的编译器cl成。 cl(字母L的小写表示) -I(字母i的大写表示,与后面的路径之间没有空格)%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

6) 运行程序 java HelloWorld就ok.

分享到:
评论

相关推荐

    Java中native方法学习

    5. **加载动态链接库**:在Java代码中使用`System.loadLibrary`方法加载编译后的动态链接库,使Java虚拟机能够访问到其中定义的native方法。 ### 使用native方法的目的 使用Java中的native方法主要有以下目的: 1...

    JNI(java native interface) 简体中文+英文版

    JNI(java native interface) 简体中文:do.chuan@gmail.com 翻译版 英文版:Addison.Wesley.Java.Native Interface 希望对大家有帮助...

    JNI(Java Native Interface)中文手册

    - **桥梁作用**:JNI充当Java与本地代码之间的桥梁,允许两种语言之间传递数据和调用方法。 - **扩展Java的功能**:通过JNI,开发者可以利用C/C++的特性来扩展Java的功能,例如实现图形界面的高性能渲染或访问硬件...

    Java Native Interface Programmers Guide and Specification(Exp)

    - **Java源代码**:包含Java类,声明了native方法,并使用`System.loadLibrary()`加载本地库。 学习JNI,开发者需要理解以下关键概念: - **JNIEnv指针**:这是JNI的核心,它是一个指向一组函数指针的指针,这些...

    使用native方法实现加密解密

    然后,在Java层创建一个Java类,声明native方法并使用`System.loadLibrary()`加载对应的动态链接库。 ```java public class MyCipher { static { System.loadLibrary("my_cipher"); } public native byte[] ...

    java的native关键字学习

    1. **JNI头文件生成**:在编写Java类并声明`native`方法后,我们需要使用`javah`工具生成对应的JNI头文件。这个头文件包含了C/C++的函数原型,供我们实现本地方法。 2. **本地方法实现**:在生成的头文件中,我们...

    java native 中的C代码

    可以使用Java的`System.loadLibrary`和`System.mapLibraryName`等方法来检查库加载是否成功,同时使用C/C++的调试器(如Visual Studio)来调试本地代码。 通过理解这些知识点,你就能编写出能够在Java程序中调用的C...

    JNA java native access

    JNA java native access

    java native 接口开发流程

    使用`javah`命令,根据带有`native`方法的Java类生成对应的JNI头文件。例如,对于上面的`HelloWorld`类,执行`javah HelloWorld`会生成一个`HelloWorld.h`头文件。 4. **编写C/C++代码**: 根据生成的头文件,...

    关于java中的native方法

    Java中的Native方法是Java语言与本地(Native)代码交互的一种机制,主要涉及到Java的JNI(Java Native ...通过阅读`jni.pdf`文档和研究`jni examples.zip`中的示例代码,可以更深入地理解JNI的工作原理和使用方法。

    Java Native Interface Specification R1.1

    JDK 1.0版本中引入了Native Method Interface(NMI),这是JNI的前身,主要目的是让Java能够调用非Java语言编写的本地方法。随后,Java Runtime Interface(JRI)和Raw Native Interface被提出,进一步发展了这一...

    jna (Java Native Access)的jar包

    jna 的jar包,JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。

    Java Native Access JNA-4.5.0

    Java Native Access (JNA) 是一个Java平台的开源库,它允许Java程序无需编写C语言的JNI(Java Native Interface)代码就能直接调用本机库函数。JNA 提供了一种简单的方式来映射Java方法到本地函数,使得开发者能够...

    Java Native Interface 6.0 Specification (JNI) 原创PDF书签

    JNI在Java的本地方法接口(Native Method Interface,NMI)基础上发展而来,最初随着Java开发工具包(JDK)1.0发布,后随着Java运行时接口(Java Runtime Interface)的集成,提供了更丰富的原生接口。 JDK1.0时,...

    JNA Java Native Access

    Java Native Access(JNA)是Java平台上的一个开源框架,它允许Java代码直接调用操作系统原生函数,而无需编写传统的Java本地接口(JNI)代码。JNA提供了一种更简单、更直观的方式来与C库和其他本地代码进行交互,极...

    JNI-Java Native Interface资料(精华)

    Java Native Interface (JNI) 是Java平台的一项强大特性,允许应用程序结合使用C、C++等其他编程语言编写的本地代码以及Java语言代码。这一功能让程序员能够在利用Java平台优势的同时,不必舍弃对遗留代码的投资。...

    Professional Java Native Interfaces with SWTJFace

    通过JNI,开发者可以编写用C或C++实现的本地方法,这些方法可以在Java虚拟机内部调用,从而实现与操作系统、硬件或特定库的深度集成。 2. **SWT (Standard Widget Toolkit)**:SWT是Eclipse开源项目的一个组件,它...

    The Java Native Interface

    THIS book covers the Java™ Native Interface (JNI). It will be useful to you if you are interested in any of the following: • integrating a Java application with legacy code written in languages such...

    The Java Native Interface Programmer's Guide and Specification

    Java Native Interface(JNI)是Java平台的一个核心组件,它允许Java应用程序调用其他编程语言编写的函数,或者让本地代码调用Java方法,从而实现了跨语言的无缝集成。 JNI在Java应用程序中的应用广泛,特别是在...

Global site tag (gtag.js) - Google Analytics