对于Java调用c++这块,一开始啥都不懂,找了很多资料,现在总算知道怎么弄了。感觉他们的有些地方没说太明白,我综合他们的,发这篇文章,希望对大家学习这块有用!
1 编写java类如
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。
方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,
它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so)
2。编译java代码
javac HelloWorld.java 生成HelloWorld.class文件
注:这个只需运行java类就能得到对应的.class
3。创建.h文件
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
在此我们不对他进行太多的解释。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 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
注:javah的另外一种简单的方法在下面介绍
4。 编写本地实现代码
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,新建一个工程!工程名称为HelloWorld(将生成HelloWorld.dll文件)
选择Win32 Dynamic-Link Library然后建立HelloWorld.cpp文件,内容如下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) //这个名称是在HelloWorld.h中得到的
{
printf("Hello world!\n");
return;
}
注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。
配置如下:在工具-》选项-》目录 中添加路径加C:\JDK\INCLUDE和C:\JDK\INCLUDE\WIN32
★关键 dll文件需要存放到 jdk的bin目录或者system32下面
5 运行Java类