最近,因项目需要,项目组的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;
}
编译该工程,生成StrTrans.dll文件。
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;
}
编译该工程,生成Java_Call_C_Dll.dll文件。
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 );
}
}
在cmd命令行键入 javac -d . TestStrTrans.java (编译测试类)
然后接着键入 java TestStrTrans
运行结果为:
大功告成。
参考:
1.http://www.cnblogs.com/AnnieKim/archive/2012/01/01/2309567.html