TestDemo:Java中通过JNI方式调用dll

 早些年工作中应用系统有采用JNI方式调用第三方类库so程序进行密码的加密,现在对此技术进行一下补充。
![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9ia2ltZy5jZG4uYmNlYm9zLmNvbS9waWMvYWVjMzc5MzEwYTU1YjMxOTA1NGNiYTA0NDNhOTgyMjZjZmZjMTcwZA?x-oss-process=image/format,png#pic_center)

百度百科有对其详细的解释,不懂的可以点击右方链接站内搜索查看。JNI_百度百科

下面为实现Java调用dll步骤演示:
坏境准备:Java运行环境JDK 1.6
代码工具:Eclipse、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);
	
}

第二步:打开CMD将目录切换到HelloWorld.java目录下(Eclipse按快捷键 Alt+Enter查看属性可找到目录路径),然后使用javah命名生成待会编译C时要用的头文件如图(先编译HelloWorld.java生成class,再使用javah命令)
在这里插入图片描述
第三步:打开Microsoft Visual C++6.0,编写dll文件。
在这里插入图片描述
在这里插入图片描述
建立好以后,再将刚才工作空间目录下面那个生成好的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);
	}
}

运行结果如图所示:
在这里插入图片描述
到此就成功调用了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值