【java】JNI实现java与C/C++混编
最近接触到java转C的任务,需要java调用非java接口;跟着教程http://www.cnblogs.com/DengGao/p/jni.html做了一下尝试,并对其中一些地方进行了更新。所用环境jdk1.8;vs2015。
一,编写带有native声明的java类
public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("HelloWorldImpl");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
HelloWorld helloworld = new HelloWorld();
helloworld.displayHelloWorld();
}
}
可以直接用记事本进行编辑,或者利用Eclipse开发工具
使用Eclipse创建步骤:
1,创建java工程
选择File->new->java project 显示 new java project向导。填入project name,并选择use project folder as root for sources and class files,从而使.java和.class在同一目录。
2,选择file->new->class 显示new java class 向导。
填入name并勾选public static void main(String[] args) 生成源代码模板。
然后填入上述代码;上述代码装入了一个动态链接库 “HelloWorldImpl”
二,使用javac编译java类
打开cmd命令并转到 HelloWorld.java所在目录
javac HelloWorld.java
执行上述命令生成 HelloWorld.class 文件
三,使用javah生成.h头文件
**由于我用的是Eclipse,所以会生成两层目录需要在外层目录进行此操作,不然会报错提示 找不到类文件。
如图:需要在d/java/jni_1目录下执行
javah -jni jni_1.HelloWorld
其中 jni_1是包名
此过程会在 d/java/jni_1目录下生成 HelloWorld.h文件
*修改文件中 #include <jni.h> 为 #include "jni.h"
否则后边会报错提示 找不到jni.h头文件
四,使用C/C++实现本地方法
利用记事本或者vs创建 HelloWorldImpl.cpp;代码如下:
#include "jni_1_HelloWorld.h"
#include <stdio.h>
#include "jni.h"
JNIEXPORT void JNICALL Java_jni_11_HelloWorld_displayHelloWorld
(JNIEnv *, jobject)
{
printf("hello world!\n");
return;
}
注意:头文件 jni.h需要用“”;
五,将C/C++编译成动态链接库
1,将C:\Program Files\Java\jdk1.8.xxx\include\jni.h
和C:\Program Files\Java\jdk1.8.xxx\include\win32\jni_md.h
与HelloWorldImpl.cpp 以及前面生成的jni_1_HelloWorld.h放到同一个目录。
2,打开vs命令行并输入如下命令进行编译
cl/LD HelloWorldImpl.cpp
根据java安装版本选择相应的vs编译,例如,当java为64位版本时,需选择vs2015 x64 native tools进行编译,不然会提示编译错误。
编译完成之后会生成四个文件
将生成的HelloWorldImpl.dll文件放到HelloWorld.java同目录
六,执行package得到结果
在包所在目录下面执行:
java jni_1.HelloWorld
此时在Eclipse下面运行也能得到相同的结果。