丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
由于项目的需要,最近研究了java调用DLL的方法,将如何调用的写于此,便于日后查阅:
采用的方法是JNI:JavaNativeInterface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互。
下面是从网上摘取的JNI工作示意图:
总体说明:先在JAVA中建立一个类,通过javac生成.class,再由javah生成.h;然后将.h复制到VC下,由VC实现具体函,
并编译通过后生成DLL,将DLL放入JAVA工程中使用,完毕。
下面说说具体步骤(含实例):
publicclassJava2cpp{static{System.loadLibrary("javaCallcpp");}publicnativeintDLL_ADD(inta,intb);//加publicnativeintDLL_SUB(inta,intb);//减publicnativeintDLL_MUL(inta,intb);//乘publicnativeintDLL_DIV(inta,intb);//除publicstaticvoidmain(Stringargs[]){
intsum=0;Java2cpptest=newJava2cpp();sum=test.DLL_ADD(2,4);System.out.println("Javacallcppdllresult:"+sum);}
}
2、生成.h文件:cmd到Java2cpp.java目录下,做如下操作:
第一步:javacJava2cpp.java生成java2cpp.class
第二步:javahJava2cpp生成Java2cpp.h头文件,内容如下:
注意:Java2cpp.h这个头文件的内容是不能修改的,否则会出错。
3、制做VC动态库:创建一个C/C++动态库工程,命名为javaCallcpp,导入java2cpp.h并实现其方法:
#include"Java2cpp.h"#include"dllApi.h"
JNIEXPORTjintJNICALLJava_Java2cpp_DLL_1ADD(JNIEnv*env,jobjectobj,jinta,jintb){intvar=0;
var=DLL_API_ADD(a,b);
returnvar;}
JNIEXPORTjintJNICALLJava_Java2cpp_DLL_1SUB(JNIEnv*env,jobjectobj,jinta,jintb){intvar=0;
var=DLL_API_SUB(a,b);
JNIEXPORTjintJNICALLJava_Java2cpp_DLL_1MUL(JNIEnv*env,jobjectobj,jinta,jintb){intvar=0;
var=DLL_API_MUL(a,b);
JNIEXPORTjintJNICALLJava_Java2cpp_DLL_1DIV(JNIEnv*env,jobjectobj,jinta,jintb){intvar=0;
var=DLL_API_DIV(a,b);
returnvar;}//此文件完
加DLL_API_ADD()、减DLL_API_SUB()、乘DLL_API_MUL()、除DLL_API_DIV()四个函数在别一个
文件中实现,文件名是dllApi.cpp,实现如下:
intDLL_API_ADD(inta,intb){return(a+b);}
intDLL_API_SUB(inta,intb){return(a-b);}
intDLL_API_MUL(inta,intb){return(a*b);}
intDLL_API_DIV(inta,intb){return(a/b);}//此文件完
此时工程还编译不过,因为include
4、编译动态库工程:生成javaCallcpp.dll,并将这个动态库复制到java工程目录下: