最近,因项目需要,项目组的java组要调用图像算法的c++动态链接库。其他的描述省略,直接进入正文。
整个基本步骤如下:
1.在vs中生成第三方动态链接库mydll.dll;
2.编写java类,并生成.h头文件;
3.在2中生成的.h头文件中的函数,借助于windows中的LoadLibrary()函数和GetProcAddress(),显式实现调用1中生成的第三方动态链接库,并在vs中生成另个一动态链接库java_call_c_dll.dll。
4.用java写个测试类。
例如我们以字符串转换为例
1.在vs中新建一DLL工程,工程名为StrTrans,工程中代码如下:
<pre name="code" class="cpp">//StrTrans.h #ifndef _STRTRANS_H #define _STRTRANS_H #ifdef _cplusplus extern "C"{ #endif #include <string> using namespace std; #define DLLEXPORT _declspec(dllexport) extern "C" DLLEXPORT int string_trans(char *in_str, char *out_str); #ifdef _cplusplus } #endif #endif
//StraTrans.cpp #include "StrTrans.h" DLLEXPORT int string_trans(char * in_str, char *out_str) { if (in_str == NULL) { printf("string is empty!"); return 0; } memcpy((char*)out_str, (char*)in_str, strlen(in_str)); printf("%s", out_str); return 1; }
2.编写一java类,代码如下:
public class StrTrans{ public native String CallStrTransDll(String address); static { System.loadLibrary("StrTransDLL"); } }
3.在cmd中输入文件存放路径,例如我的文件存放路径d:\CallThirdPartyDll\src
在cmd中键入 d: 回车
切换到d盘,键入cd CallThirdPartyDll\src
进入该文件目录,键入 javah StrTrans ,在文件夹中会生成StrTrans.h文件。
4.在vs中新建一dll工程,名为Java_Call_C_Dll工程,将头文件StrTrans.h加入工程,并新建一文件,命名为StrTrans.cpp
代码如下:
//StrTrans.cpp #include "StrTrans.h" #include <Windows.h> #include <string> using namespace std; typedef int (*Str_Trans)(char *, char *); JNIEXPORT jstring JNICALL Java_StrTrans_CallStrTransDll (JNIEnv * env, jobject obj, jstring j_str) { int ret; const char *c_str; char c_result[1024]; jstring result ; result = NULL; HMODULE handle = NULL; Str_Trans _Str_Trans; handle = LoadLibrary("<span style="font-family: Arial, Helvetica, sans-serif;">StrTransDLL</span>"); if (handle) { _Str_Trans = (Str_Trans)GetProcAddress(handle, "string_trans"); if (_Str_Trans) { //c_str = jstring2str(env, j_str); c_str = (env)->GetStringUTFChars(j_str, 0); memset(c_result, 0, sizeof(char) * 1024); _Str_Trans((char*)c_str, c_result); //result = str2jstring(env, c_result); (env)->ReleaseStringUTFChars(j_str, c_str); printf("c_result = %s\n", c_result); result = (env)->NewStringUTF(c_result); } else { printf("GetProcAddress() is failed : %d \n", GetLastError()); } FreeLibrary(handle); } else { printf("LoadLibrary() is failed : %d\n", GetLastError()); } return result; }
5. 用java写一测试类,代码如下:
public class TestStrTrans { public static void main(String[] args) { StrTrans callStrTrans = new StrTrans(); String result = callStrTrans.CallStrTransDll("E:\\source\\XK\\Image\\Normal_Cut_07_08\\2015071436112288414.jpg"); System.out.println("result = "+result ); } }
然后接着键入 java TestStrTrans
运行结果为:
大功告成。
参考:
1.http://www.cnblogs.com/AnnieKim/archive/2012/01/01/2309567.html