您的位置:首页 > 编程语言 > C语言/C++

java借助于JNI调用c/c++动态链接库

2015-08-05 16:09 573 查看
最近,因项目需要,项目组的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: