【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进行编译,不然会提示编译错误。

编译完成之后会生成四个文件

注:另外一种编译方法(不需要头文件拷贝)

cl/LD -I "C:\Program Files\Java\jdk1.8.0_181\include" -I "C:\Program Files\Java\jdk1.8.0_181\include\win32" HelloWorldImpl.cpp

此种方法是将头文件以-I的方法进行指定,同时上面的jni.h就不需要改成“”,直接使用原来的<jni.h>.

将生成的HelloWorldImpl.dll文件放到HelloWorld.java同目录

六,执行package得到结果

在包所在目录下面执行:

java jni_1.HelloWorld

此时在Eclipse下面运行也能得到相同的结果。

猜你喜欢

转载自blog.csdn.net/xll_bit/article/details/83112458
今日推荐