JAVA如何通过JNI调用由C语言编写的代码。一般步骤如下:

1.第一步:编写Java代码

2.第二步:编译Java代码

3.第三步:生成C语言头文件

4.第四步:编写C代码

5.第五步:生成C共享库

6.第六步:运行Java程序


1》编写Java代码

class HelloJNI
 {
//本地方法声明
native void printfHello();
native void printString(String str);

//加载库
static{System.loadLibrary("hellojni");}

public static void main(String args[])
{
HelloJNI myJNI = new HelloJNI();
//调用本地方法(实际调用的是使用C语言编写的JNI本地函数)
myJNI.printHello();
myJNI.printString("Hell world ");

}
 }

代码中使用native关键字,声明本地方法,该方法与C/C++编写的JNI本地函数对应。native告诉编译器声明部分在C/C++代码实现的。

System.loadLibrary("hellojni")加载静态库。下面是Windows与linux静态库说明:


2》编译Java代码

使用的是javac编译器,执行命令:javac HelloJNI.java。生成HelloJNI.class文件。这时候的HelloJNI.class不能运行。缺少运行库文件。

3》生成C语言头文件

Java虚拟机在加载本地运行库的时候,通过使用函数原型将运行库中的C函数与Java代码中的本地方法映射在一起的。当生成了函数原型,Java虚拟机就把本地库中的相应函数与Java方法映射在一起。

创建本地方法的映射C函数,先得生成函数原型,函数原型存放在C/C++头文件中。Java提供了javah工具,位于<JDK_HOME>\BIN目录下,用来生成包含函数原型的C/C++头文件,使用:javah 《包含以native关键字声明的方法的Java类名称>

运行javah命令,会在当前目录下面生成Java类名相同名称的C语言头文件。会生成C头文件中,定义与Java本地方法想连接的C函数原型。执行命令:javah HelloJNI   在目录中会看到生成的HelloJNI.h头文件。

生成头文件中,函数原型遵循下面的样式:


使用javah后Java与JNI对比:



4》编写C语言代码

C语言函数原型生成后,编写HelloJNI.c文件,实现JNI本地函数。

#include <stdio.h>
#include "HelloJNI.h"


JNIEXPORT void JNICALL_Java_HelloJNI_printHello(JNIEnv *env,jobject obj)
{
printf("hello world\n");
return ;
}
JNIEXPORT void JNICALL_Java_HelloJNI_printString(JNIEnv *env,jobject obj,jstring string)
{
const char *str = (*env)->GetStringUTFChars(env,string,0);
printf("%s!\n",str);
return;

}

GetStringUTFChars()是JNI函数,用来将Java字符串转换成C语言字符串。使用此函数转换字符串之后,再使用printf()函数输出,就实现将本地方法传递来的字符串输出到控制台上。JNI提供了很多的JNI函数,用来处理C字符串与Java字符串的转换。这些函数可以在Java官网查看到。

5》生成C共享库

使用VS命令编译,在你电脑的开始栏点击后找到命令提示那个工具:

命令:


运行后生成hellojni.dll。

6》运行Java程序

执行Java命令,运行HelliJNI类,查看结果是否正常。


利用JNI调用jni本地函数