一、JNI概念
JNI是Java Native Interface的缩写.
设计目的是:标准JAVA库不支持一些平台特性,你可以用别的语言,编写代码使得
你的软件支持这些平台特性,也可能你的程序需要用低级语言编写一些算法以提高程序的效率.
JNI允许Java代码和其他语言写的代码进行交互。
二、JNI编程简介
书写步骤:
1、编写带有native 声明的java类;
2、使用javac命令编译所编写的java类;
3、使用javah -jni com.ikags.project.XXXX编译成扩展名为h的头文件;
4、使用C/C++(或其他编程语言) 实现本地方法;
5、将C/C++编写的文件生成动态连接库;
6、将.dll(.so)文件提供给需要的项目,用system.loadLibrary方法调用;
三、JNI实例
1、编写java程序
这里以HelloWorld为例。
代码1:
class HelloWorld{
public native void displayHelloWorld(); //声明一个native本地函数
static{
System.loadLibrary(hello);
}
}
声明native方法:如果你想将一个方法作为一个本地方法的话,那么你就必须声明改
方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述,函数名
displayHelloWorld要和后面C模块中的函数名对应。
Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方
法displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行
初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();注意
loadLibrary方法的参数不是"libhello.so",而是去掉前缀和后缀之后的"hello"。
2、编译
javac HelloWorld.java
3、生成扩展名为h的头文件
javah -jni HelloWorld
头文件的内容:
/*DO NOT EDIT THIS FILE-it is machine generated*/
#include
/*Header for class HelloWorld*/
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
*Class:HelloWorld
*Method:displayHelloWorld
*Signature:()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *,jobject);
#ifdef __cplusplus
}
#endif
#endif
这里可以这样理解:这个h文件相当于我们在java里面的接口,这里说明了个
Java_HelloWorld_displayHelloWorld(JNIEnv *,jobject);方法,然后在我们的本地方法里
面实现这个方法,也 就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致。
4、编写本地方法
实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env,jobject obj)
{
printf("Hello world!\n");
return;
}
注意代码2中的第一行,需要将jni.h(可以在%JAVA_HOME%/include/文件夹下找到)文件引入,因
为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将
HelloWorld.h头文件引入(可以理解为:相当于在编写java程序的时候,实现一个接口的话,需要声
明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现)。然后保存为
HelloWorldImpl.c就可以了。
5、生成动态库
编译HelloWorldImpl.c为动态库hello.so。
6、允许程序
java HelloWorld
四、常见文件
1、java和c是如何互通的
不能互通的原因注意是数据类型的问题,jni解决了这个问题,例如那个c文件中的jstring数据类型
就是java传入的String对象,经过jni函数的转化就能成为c的char*。
阅读(655) | 评论(0) | 转发(0) |