第一步:编写、编译java代码
class HelloJNI {
/*1、本地方法声明
* 本地方法和本地函数:jni实现,方法在java代码中声明的,而具体实现实在C/C++代码中。在
*一般的JNI书籍中,将这两种情况下的方法都成为本地方法,容易混淆。故将尽在java代码中声明
*的方法称为本地方法,使用C/C++实现的函数称为本地函数。
* 在java类中,使用“native”关键字,声明本地方法,该方法与用C/C++编写的JNI本地函数相
*对应。“native”关键字告诉java编译器,在java代码中带有该关键字的方法只是申明,实
*现在C/C++等其他语言中。
*/
native void printHello();
native void printString(String str);
/*2、加载库
* 加载具体实现本地方法的C运行库。在java中加载本地运行库是通常使用“静态块”,使C运行
*库在调用本地方法之前加载进来。
**/
static {
System.loadLibrary("hellojni");
}
/*3、本地方法和本地函数映射,在后面完成了*/
public static void main(String args[]) {
HelloJNI myJNI = new HelloJNI();
/*4、调用本地方法*/
myJNI.printHello();
myJNI.printString("Hello World from printString fun");
}
}
编译 javac HelloJNI.java
第二步:生成C语言头文件
运行时,Java虚拟机会在加载的本地运行库中查找与java本地方法相匹配的C函数,并生成映射表,
而后将java本地方法与C函数连接在一起的。如何链接,使用函数原型。当生成了函数原型,java虚拟机
即可把本地库中相应的函数与java本地方法映射在一起。
/*1、生成函数原型HelloJNI.h(头文件)*/
javah HelloJNI
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printHello
(JNIEnv *, jobject); /*JNIEnv是JNI接口的指针,后面介绍。jobject为JNI提供的java本地类型
*保存着调用本地方法对象的一个引用。
*若本地方法为静态方法时(static),第二个参数为jclass。
*/
/*
* Class: HelloJNI
* Method: printString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printString
(JNIEnv *, jobject, jstring);
#include "HelloJNI.h"
#include <stdio.h>
/*
* Class: HelloJNI
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
/*
* Class: HelloJNI
* Method: printString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject obj, jstring string)
{
/*注意:jstring是java本地类型,它对应于java中的String类型,在内存中占用16位。而在C语言中
*字符串仅占用8位,在C语言中无法直接使用jstring类型的字符串,因此需要将jstring类型的字符
*串转换成C语言字符串。
*/
const char *str = (*env)->GetStringUTFChars(env,string,0);
printf("%s!\n",str);
return;
}
gcc -shared -fPIC hellojni.c -o libhellojni.so -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/
export LD_LIBRARY_PATH=.
#java HelloJNI
Hello World!
Hello World from printString fun!