java调用windows DLL实现底层处理(C++编程)

java调用windows DLL实现底层处理


背景:
众所周知,java开发平台基于java虚拟机实现,使程序员不用关心底层实现,重点关注程序本身的功能及逻辑,C++相比于java,可以实现更底层的开发,相对来说,速度上要比java要快一些,今写了一个加密解密的DLL,总结一下,java调用windowsDLL的过程,希望对处理相关问题的同事有所启发。
Java调用C++的相关接口封装在javajni.hjni_md.h两个头文件中;
开发工具:

Visual studio 2005

步骤:
一、java安装目录
Java/jdk1.5.0_18/include目录下拷出jni.h
Java/jdk1.5.0_18/include/win32 目录下拷出jni_md.h
装上面java目录下的两个文件拷到Visual Studio项目所在目录下,并将jni.h文件中的:
#include <jni_md.h>
改为:
#include "jni_md.h"
二、在java平台中
1、编写java程序EncodeTool.java
2、编译javac EncodeTool.java
3、生成头文件
javah EncodeTool
生成EncodeTool.h文件,将头文件中的:
#include <jni.h>
改为:
#include "jni.h"
然后将EncodeTool.h文件拷到VS项目目录下;
三、制作VC++动态库
建立新DLL工程,程序中添加:
#include "EncodeTool.h"
JNIEXPORT jstring JNICALL Encrypt(JNIEnv * env, jobject, jstring strMs, jstring strPwd, jstring strEncryptPwd)
{


//
分别为三个jstring申请内存空间并转换为char *


char * But_phoneNum;



But_phoneNum = jstringToWindows(env, strMs);




char * But_phonePwd;



But_phonePwd = jstringToWindows(env, strPwd);




char * But_phonePpwd;



But_phonePpwd = jstringToWindows(env, strEncryptPwd);



// char *
转换为 string


string strMsisdn(But_phoneNum);



string strPasswd(But_phonePwd);



string strEncryptPasswd(But_phonePpwd);



//
加密部分自己写

//
。。。。。。

// string
char *


But_phoneNum = (char *)strMsisdn.c_str();



But_phonePwd = (char *)strPasswd.c_str();



But_phonePpwd = (char *)strEncryptPasswd.c_str();


// char *
转换为 jstring

strMs = WindowsTojstring(env ,But_phoneNum);



strPwd = WindowsTojstring(env ,But_phonePwd);



strEncryptPwd = WindowsTojstring(env ,But_phonePpwd);




return strEncryptPwd;


}

JNIEXPORT jstring JNICALL Decrypt(JNIEnv * env, jobject, jstring strMs, jstring strPwd, jstring strEncryptPwd)
{

//
同上
}

// jstring TO Windows
代码Internet可网上搜
char* jstringToWindows(JNIEnv
*env, jstring jstr)

{

int length = (env)->GetStringLength(jstr);


const jchar* jcstr = (env)->GetStringChars(jstr, 0);


char* rtn = (char*)malloc( length+1 );


memset(rtn, 0, length+1);


int size = 0;


size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length+1), NULL, NULL);


if( size <= 0 )


return NULL;


(env)->ReleaseStringChars(jstr, jcstr );


rtn[size] = 0;


return rtn;

}

// Windows TO jstring
代码Internet可网上搜
jstring WindowsTojstring(JNIEnv* env, char* str)
{

jstring rtn = 0;


int slen = strlen(str);


unsigned short * buffer = 0;


if( slen == 0 )


rtn = (env)->NewStringUTF(str);


else


{


int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0);


buffer = (unsigned short *)malloc( length*2 + 1 );


if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0)


rtn = (env)->NewString((jchar*)buffer, length);


}


if( buffer )


free( buffer );


return rtn;

}
四、完成编译后将DLL拷至java项目目录中;
五、在java中加载并进行相关调用:
System.loadLibrary("EncodeTool");
总结:
Java中使用的字符集为ISO8859_1,使用前需转换为C++中的存储模式,再进行完
相关的数据运算或代码实现后,再转换为java中的格式;
以函数形参中涉及到的字符或中文为例,java中直接传入jstring,传到DLL中先转换为char *,再转换为string,处理完成相关功能后,再将string转换为char *,再转换为jstring传回java调用处。

注:
   以上经过实际调试并总结,使整个过程更简洁清析,部分代码可能涉及公司信息安全,已删除;

  java制做头文件及DLL存放过程中需注意路径问题,不然会报JVM:Exception_Access_Violation 0XC0000005的动行时错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值