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

最近,因项目需要,项目组的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

你可能感兴趣的:(java,C++)