JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static { System.loadLibrary(“goodluck”); }
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。 还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。 例如程序testdll.java,内容为:
public class testdll {
static { System.loadLibrary("goodluck"); }
public native static int get();
public native static void set(int i);
public static void main(String[] args) {
testdll test = new testdll(); test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。 再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
二、C/C++中所需要做的工作
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。 接上例子。我们先看一下testdll.h文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具体实现的时候,我们只关心两个函数原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和 JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint); 这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。 好,下面我们用testdll.cpp文件具体实现这两个函数: #include "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
推荐网址:
http://www.matrix.org.cn/resource/article/2008-10-29/16301a5a-a584-11dd-9ec1-71d7264eb72f.html
http://www.javaworld.com/javaworld/jw-02-2008/jw-02-opensourcejava-jna.html?page=1
分享到:
相关推荐
本手册将深入探讨JNI的使用和原理。 首先,要在Java程序中使用JNI,需要在Java类中声明要调用的本地库,并对将调用的方法进行本地声明。如示例所示,声明加载库的代码是: ```java static { System.loadLibrary(...
Java本地接口(JNI)是一个用于Java语言编程的应用程序接口(API),它允许Java代码在Java虚拟机(JVM)中运行时,与用C、C++或汇编等其他编程语言编写的应用程序或库进行交互。JNI对于Android开发人员而言尤为重要...
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good) 19 Chap6: JNI传递返回值... 26 15.2.2.3 传递字符...
JNI完全手册资料
Java 本地接口(Java Native Interface,JNI)是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。JNI自Java 1.1引入以来,已经成为在Java应用程序中集成C/C++代码的标准方式,尤其是在处理高性能计算、...
本手册的"JNI-API完全手册.doc"文件,很可能是详细列出了所有这些概念和API的使用方法,包括每个函数的参数、返回值、注意事项和示例代码。通过学习这份文档,开发者可以深入理解JNI的工作原理,熟练运用JNI来解决...
Java 本地接口(JNI,Java Native Interface)是Java平台中用于连接Java代码和本地(非Java)代码的桥梁。JNI允许Java程序调用其他编程语言(如C、C++、汇编等)编写的函数,同时也让本地代码能够调用Java类的方法。...
### JNI 完全手册知识点: #### 1. JNI 定义与设计目的 JNI定义了Java和本地应用之间交互的接口,它允许Java代码调用本地应用程序接口(如C/C++),反之亦然。这种设计的目的主要是为了: - 允许Java代码访问系统...
在阅读《JNI完全手册》这本书时,开发者应重点理解和实践这些知识点,以便在需要将Java与其他语言结合,或者需要提升性能的场合,能够有效地运用JNI技术。同时,了解JNI也有助于深入理解Java平台的工作机制,对于...
JNI手册,介绍JNI的使用 android JNI框架的搭建。
JNI完全数据手册,方便Android开发者阅读,下载看下,应该是用得上。