您的位置:首页 > 编程语言 > Java开发

vc 编写dll 供java调用

2012-05-07 10:18 381 查看
(1)首先写一个java类,内容如下:

package com.bw.gb2py;

public class GB2PY {

static

{

System.loadLibrary("GB2PY"); //载入dll

}

public native static String GetPY(String name);//函数声明

}

(2)编译该java文件,再编译生成头文件(供vc使用)

javac GB2PY.java //编译生成class

(3)在当前文件夹下创建 com/bw/gb2py 文件夹,将GB2PY.class放入该文件夹,回到当前文件夹,调用javah命令生成头文件。

javah com.bw.gb2py.GB2PY //生成头文件,文件名为com_bw_gb2py_GB2PY.h

注意头文件中的内容不能更改,否则生成的dll不能使用

(4)在VC中新建名为GB2PY的Win32 dll工程,将com_bw_gb2py_GB2PY.h拷贝到工程目录下,并加入工程。再拷贝%J***A_HOME%/include/jni.h 和 %J***A_HOME%/include/win32/jni_md.h 到工程目录下,并加入工程。

(5)实现com_bw_gb2py_GB2PY.h中声明的方法:Java_com_bw_gb2py_GB2PY_GetPY。注意java string和c中char的转换。java的string都用unicode编码(双字节),而char是单字节的。

int (*GetPY)(char* szGBString,PY &oPY);

JNIEXPORT jstring JNICALL Java_com_bw_gb2py_GB2PY_GetPY

(JNIEnv * env, jclass, jstring name)

{

static HMODULE hModle = LoadLibrary("PYconvert.dll"); //第三方dll

GetPY = (LPFUN)GetProcAddress(hModle,"GBToPY");



int len;

char charName[128];

char charPY[512];



len = env->GetStringLength(name) * 2 + 1; //双字节长度转为单字节长度,加1是为了加结束符

memset(charName, 0, len);



const wchar_t * w_buffer = env->GetStringChars(name, 0);

int wlen = wcslen(w_buffer);

len = WideCharToMultiByte(CP_ACP, 0, w_buffer, wcslen(w_buffer) + 1, charName, len, NULL, NULL);

env->ReleaseStringChars(name, w_buffer);

//以上代码将java string name中的内容拷贝到了char数组charName中

... //省略部分功能代码,通过调用第三方的dll函数将汉字转换为拼音,存储在charPY数组中

int slen = strlen(charPY);

jchar * buffer = new jchar[slen];

len = MultiByteToWideChar(CP_ACP, 0, charPY, strlen(charPY), buffer, slen);

if (len > 0 && len < slen)

buffer[len] = 0;

//以上代码将char型字符串转换为jchar型字符串

jstring js = env->NewString(buffer, len);

delete [] buffer;

return js;

}

(6)编译生成dll文件,在java中就可以调用了(要用到第二步生成的类)!JSP当然也没问题哈!:)

JNT中很有用的jstring 与 const char* 的相互转换函数

我们使用JNI的时候经常碰到jstring 与 const char*转换的问题,以及中文编码问题,

这里从网上看到的2个比较好的相互转换函数,今天把它摘录下来,以备用之。呵呵。

//将const char类型转换成jstring类型

jstring CStr2Jstring( JNIEnv* env, const char* pat )

{

//定义java String类 strClass

jclass strClass = (env)->FindClass("Ljava/lang/String;");

//获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String

jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");

//建立byte数组

jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));

//将char* 转换为byte数组

(env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);

//设置String, 保存语言类型,用于byte数组转换至String时的参数

jstring encoding = (env)->NewStringUTF("GB2312");

//将byte数组转换为java String,并输出

return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);



}

char* Jstring2CStr(JNIEnv* env, jstring jstr)

{

char* rtn = NULL;

jclass clsstring = env->FindClass("java/lang/String");

jstring strencode = env->NewStringUTF("GB2312");

jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");

jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);

jsize alen = env->GetArrayLength(barr);

jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);

if(alen > 0)

{

rtn = (char*)malloc(alen+1); //new char[alen+1];

memcpy(rtn,ba,alen);

rtn[alen]=0;

}

env->ReleaseByteArrayElements(barr,ba,0);



return rtn;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: