第一步:编写、编译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!