Java某些时候需调用本地c/c++代码,Sun公司提供的JNI是java平台一个功能强大的接口,该接口提供了java与操作系统本地代码互相调用的功能
最简单的java调用c/c++代码步骤:
① 在java类中声明一个native的方法(native表其具体代码由本地c/c++实现)
② 使用javah命令生成包含native方法的c/c++头文件
javah -help
③ 按照生成的头文件编写c/c++源代码(生成dll动态链接库工程、添加头文件)
④ 将c/c++源文件编译为dll(与exe类似,为可执行二进制代码)
④ 把dll文件加入到path环境变量下
④ java类中加载dll,然后调用native方法
操作:
public class Test {
public native void sayHello();
public static void main(String[] args) {
System.loadLibrary(" cppTest ");
Test test=new Test();
test.sayHello();
}
}
K:\>cd K:\files\workspace\Test\src //源码Test.java所在目录
K:\files\workspace\Test\src>javah Test //生成Test.h
#include <iostream>
#include "Test.h"
using namespace std;
JNIEXPORT void JNICALL Java_Test_sayHello(JNIEnv *env, jobject obj)
{
cout<<"hello world"<<endl;
}
//编译生成 cppTest.dll ,编译过程中所需jni.h等头文件从jdk目录拷贝
//path修改后需重启eclipse
使用JNI的两个弊端:
① 使用了JNI,该APP将不能再跨平台,如移植到别的平台,native代码需重新编写
② java是强类型语言,而c/c++非,故在写JNI时需小心
总之,构建java程序时,尽量少用本地代码
最简单的java调用c/c++代码步骤:
① 在java类中声明一个native的方法(native表其具体代码由本地c/c++实现)
② 使用javah命令生成包含native方法的c/c++头文件
javah -help
③ 按照生成的头文件编写c/c++源代码(生成dll动态链接库工程、添加头文件)
④ 将c/c++源文件编译为dll(与exe类似,为可执行二进制代码)
④ 把dll文件加入到path环境变量下
④ java类中加载dll,然后调用native方法
操作:
public class Test {
public native void sayHello();
public static void main(String[] args) {
System.loadLibrary(" cppTest ");
Test test=new Test();
test.sayHello();
}
}
K:\>cd K:\files\workspace\Test\src //源码Test.java所在目录
K:\files\workspace\Test\src>javah Test //生成Test.h
#include <iostream>
#include "Test.h"
using namespace std;
JNIEXPORT void JNICALL Java_Test_sayHello(JNIEnv *env, jobject obj)
{
cout<<"hello world"<<endl;
}
//编译生成 cppTest.dll ,编译过程中所需jni.h等头文件从jdk目录拷贝
//path修改后需重启eclipse
使用JNI的两个弊端:
① 使用了JNI,该APP将不能再跨平台,如移植到别的平台,native代码需重新编写
② java是强类型语言,而c/c++非,故在写JNI时需小心
总之,构建java程序时,尽量少用本地代码