JAVA中利用JNI与VS2012实现C/C++的DLL调用
2014-02-26 17:44
696 查看
在WINDOWS下,DLL调用是非常普遍的,那么在JAVA下又要如何实现呢?JAVA中可以借助JNI/JAWIN/JACOB,这里以JNI为例。JNI是Java Native Interface的缩写,中文为JAVA本地调用。
在用JNI调用DLL之前,我们先来思考下WINDOWS下编写及调用DLL的步骤。一般在建立一个DLL项目之后,需要增加相应的头文件,头文件中需要声明公布的接口,然后在对应的C/CPP文件中实现具体的方法,最后在调用DLL的项目中动态加载DLL,并调用相应的接口,以达到预期功能。在JNI调用DLL的步骤中,和这个过程差不多,只不过因为是基于JNI的,所以在一些数据类型和声明上会有一些变化。那我们又怎么去对应这些数据类型呢?
这个不需要我们来操心,只需要先编写调用的JAVA文件,然后使用javah命令来编译,就会生成相应的头文件,然后拿编译DLL的项目中去引用即可。现在我们先来写一下调用的JAVA文件,代码如下。
Calculater.java
现在打开CMD命令,然后输入javah -jni Calculater回车,这时就会生成Calculater.h的头文件。这里需要注意,Calculater是JAVA文件的名字,一定不能输成Calculater.java,这样会报错。对于javah,如果没有添加java的环境变量有可能会无法直接使用该命令,比如我的JDK路径是D:\Java\jdk1.7.0_02\bin,将该路径添加到环境变量中,javah就可以执行了。
打开VS2012,建立一个DLL的空项目,将Calculater.h复制到该项目的目录下,然后新建一个Calculater.cpp文件,该文件代码如下:
执行编译,这时可能会报错,提示jni.h找不到,需要将jni.h所在的文件加入到项目的包含目录中。可以在项目中点右键->属性,然后参照下面的图添加。
添加完成后,再次编译,这时在Release或Debug文件夹下会生成一个Calculater.dll的文件,将其复制到Calculater.java所在的目录下。
在CMD中执行命令javac Calculater.java,注意是Calculater.java,不是Calculater,否则会出错。这个和前面的javah不同。编译成功后,就可以运行了。
在CMD中分别输入命令java Calculater、java Calculater 10 20、java Calculater 20会得到如下的结果。
这些结果正是预料中的结果,DLL的调用达成。
转载请注明出处JNI与VS2012实现C/C++的DLL调用
在用JNI调用DLL之前,我们先来思考下WINDOWS下编写及调用DLL的步骤。一般在建立一个DLL项目之后,需要增加相应的头文件,头文件中需要声明公布的接口,然后在对应的C/CPP文件中实现具体的方法,最后在调用DLL的项目中动态加载DLL,并调用相应的接口,以达到预期功能。在JNI调用DLL的步骤中,和这个过程差不多,只不过因为是基于JNI的,所以在一些数据类型和声明上会有一些变化。那我们又怎么去对应这些数据类型呢?
这个不需要我们来操心,只需要先编写调用的JAVA文件,然后使用javah命令来编译,就会生成相应的头文件,然后拿编译DLL的项目中去引用即可。现在我们先来写一下调用的JAVA文件,代码如下。
Calculater.java
public class Calculater { public static void main(String[] args) { if(args==null||args.length<=1) { System.out.println("Please input two integer."); return; } Calculater app = new Calculater(); int sum = app.Sum( Integer.parseInt(args[0]), Integer.parseInt(args[1])); System.out.println(sum); } public native int Sum(int a, int b); static { System.loadLibrary("Calculater"); } }
现在打开CMD命令,然后输入javah -jni Calculater回车,这时就会生成Calculater.h的头文件。这里需要注意,Calculater是JAVA文件的名字,一定不能输成Calculater.java,这样会报错。对于javah,如果没有添加java的环境变量有可能会无法直接使用该命令,比如我的JDK路径是D:\Java\jdk1.7.0_02\bin,将该路径添加到环境变量中,javah就可以执行了。
打开VS2012,建立一个DLL的空项目,将Calculater.h复制到该项目的目录下,然后新建一个Calculater.cpp文件,该文件代码如下:
#include "Calculater.h" #include <math.h> #include <stdio.h> JNIEXPORT jint JNICALL Java_Calculater_Sum (JNIEnv *env, jobject obj, jint a, jint b){ return a+b; }
执行编译,这时可能会报错,提示jni.h找不到,需要将jni.h所在的文件加入到项目的包含目录中。可以在项目中点右键->属性,然后参照下面的图添加。
添加完成后,再次编译,这时在Release或Debug文件夹下会生成一个Calculater.dll的文件,将其复制到Calculater.java所在的目录下。
在CMD中执行命令javac Calculater.java,注意是Calculater.java,不是Calculater,否则会出错。这个和前面的javah不同。编译成功后,就可以运行了。
在CMD中分别输入命令java Calculater、java Calculater 10 20、java Calculater 20会得到如下的结果。
这些结果正是预料中的结果,DLL的调用达成。
转载请注明出处JNI与VS2012实现C/C++的DLL调用
相关文章推荐
- jni java调用c++实现的dll
- Java调用C/C++实现的DLL动态库——JNI(转)
- Java调用C/C++实现的DLL动态库——JNI
- Android利用JNI实现java调用C或C++
- eclipse JNI示例。利用C/C++实现JAVA中调用的函数
- Java调用C/C++实现的DLL动态库——JNI
- Java调用C/C++实现的DLL动态库——JNI
- Java调用C/C++实现的DLL动态库——JNI
- 利用JNI在vs2010上实现c++调用Java类方法
- 0072 JAVA JNI 如何调用C或者C++生成的dll【基础】
- [2014.1.31] Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
- Java使用JNI调用C/C++的DLL动态链接库2
- Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
- [JNI] Java 调用 C++ dll
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
- JNI、C/C++、java调用dll、java与c数据类型对应关系
- Cocos2d-x通过Jni实现C++与Java相互调用
- cocos2dx 使用jni实现java调用c++