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,工程中代码如下:
编译该工程,生成StrTrans.dll文件。
2.编写一java类,代码如下:
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
代码如下:
编译该工程,生成Java_Call_C_Dll.dll文件。
5. 用java写一测试类,代码如下:
在cmd命令行键入 javac -d . TestStrTrans.java (编译测试类)
然后接着键入 java TestStrTrans
运行结果为:
大功告成。
参考:
1.http://www.cnblogs.com/AnnieKim/archive/2012/01/01/2309567.html
整个基本步骤如下:
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
相关文章推荐
- C++黑客编程揭秘与防范之创建一个不会被删除的文件夹
- 如何用C++实现一个LRU Cache
- 详解c++构造函数
- C# 调用 C++ 写的Dll 遇到的问题(调用DLL 自动退出)
- C++/STL Bitset (转)
- [转] 浅谈 C++ 中的 new/delete 和 new[]/delete[]
- 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
- C++ 拷贝构造函数 和 六大函数
- C++ list和用vector区别
- C++实现支持浮点(x.x)的四则运算(带括号)
- 刚接触C++,在此就写一个转化为二进制的小程序
- 用VS2008编译(zlib)C语言代码的方法
- C++中的四种转型操作符
- 黑马程序员---C语言基础---概述、运算符
- C++易混淆概念
- 【C++】拷贝构造函数和赋值函数
- map
- VC++绘图时,利用双缓冲解决屏幕闪烁 转载
- c++ 时间处理
- C语言之static作用