博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA之JNI从头完整实例
阅读量:6995 次
发布时间:2019-06-27

本文共 2139 字,大约阅读时间需要 7 分钟。

hot3.png

Java调用dll

实例下载地址:

准备阶段: 1).Java 环境 JDK(其实这个没啥说的....)

              2).MyEclipse或者Eclipse(这个自己选择)

              3).C语言IDE Microsoft Visual C++6.0(这个也可以自己选择)

    以下步骤中的使用的工具都是以我个人所使用的为例

    第一步:打开Eclipse建如图项目: 生成Java与C之间的通信约定接口     

代码如下:

/** * 主要就是生成Java与C/C++之间进行通信的约定接口 * */public class HelloWorld {		static {		System.loadLibrary("HelloWorld");	}		public HelloWorld() {	}		public native int init(int lPort);		public native void print(String str);	}

   

 第二步:找到项目所在的Eclipse目录空间,属性中查看(Eclipse按快捷键 Alt+Enter )

    

然后打开CMD将目录切换到HelloWorld.java目录下,例如我这儿目录就是 "E:\workspace\JavadllDemo\src\" 然后使用javah命名生成待会编译C时要用的头文件如图(先编译HelloWorld.java生成class在使用javah命令):

 

 第三步:该写我们的dll文件了,打开Microsoft Visual C++6.0

 

 

建立好以后,在将刚才E:\workspace\JavadllDemo\src目录下面那个生成好的HelloWorld.h文件复制到C的工作空间中,但是由于在编译能被java程序调用也能被C程序调用的dll的时候还需要两个头文件,一个是jni.h 一个是jni_md.h

这两个文件分别位于你的jdk安装目录中include文件夹中 JAVA_HOME\jdk1.6.0_17\include\jni.h  ,JAVA_HOME\jdk1.6.0_17\include\win32\jni_md.h

将这两个文件还有HelloWorld.h一共三个文件一起复制到C项目的工作空间中,复制到C项目工作空间后还需要改一下HelloWorld的头文件引入方式 需要把#include <jni.h> 换成 #include "jni.h" 最后如下图:

第四步:写dll里面的要被Java所调用的函数

// HelloWorld.cpp : Defines the entry point for the DLL application.//#include "HelloWorld.h"/* * Class:     HelloWorld * Method:    init * Signature: (I)I */JNIEXPORT jint JNICALL Java_HelloWorld_init(JNIEnv *env, jobject job, jint lPort){	 int number=10;	 number+=lPort;	 return number;}/* * Class:     HelloWorld * Method:    print * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject job, jstring str){	printf("%d\n", str);}

如下图所示:

最后组建编译我们的dll(先重组,在编译) 如下图:

编译过程可能会出现此错误:unexpected end of file while looking for precompiled header directive 解决办法如下图(alt+f7):

 

进行如上图设置后在编译,如果提示没出错,就表示编译成功!

编译好以后就会在我们的C项目工作空间Debug文件夹中找到HelloWorld.dll,此时我们把这个HelloWorld.dll复制到我们的Java项目中的lib文件中,然后一定要配置好我们的Native library path

第五步:测试调用我们自己写的DLL了

新建一个在HelloWorld所在类中在新建一个Test类,写如下代码:

public class Test {	public static void main(String[] args) {		HelloWorld hw=new HelloWorld();		hw.print("Hello World!");		int number=hw.init(123);		System.out.println(number);	}}

写完以后直接运行Test类

最后结果如图所示:

 

文章略显粗糙,但按照步骤来,应该是没问题的,欢迎一起交流!

转载于:https://my.oschina.net/Thinkeryjgfn/blog/362304

你可能感兴趣的文章