JNI参数传递以及中文编码问题解决

这两天因为需要做一个用java读写IC卡的程序,制卡厂商只提供的dll库,无奈之下只能去挖JNI了,期间遇到了两个大问题
1。中文字符乱码,按官方文档里的说法用JNI中的JNIEnv提供的GetStringUTFChars方法问题依旧。
废话不多说了,把解决方案贴出来,闹了半天就是字符位数的问题。

/*
由jstring向char*的转换
*/

char* jstringTostring(JNIEnv* env, jstring jstr )
{
int length = env->GetStringLength(jstr);
const jchar* jcstr = env->GetStringChars( jstr, 0 );
char* rtn = (char*)malloc( length*2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,
(length*2+1), NULL, NULL );
if( size <= 0 )
return NULL;
env->ReleaseStringChars( jstr, jcstr );
rtn[size] = 0;
return rtn;
}

/*
由char*向jstring的转换
*/

jstring stringTojstring(JNIEnv* env,const char* s)
{
if (s == NULL)
return NULL;
int clen = lstrlen(s);
int wlen = clen+1;
WCHAR* cs = new WCHAR[wlen];
wlen = ::MultiByteToWideChar(CP_ACP,NULL,s,clen,cs,wlen);
cs[wlen]=NULL;
jstring js = env->NewString((const jchar*)(WCHAR*)cs,wlen);
delete[] cs;
return js;
}

2。参数传递问题
我需要把通过调用dll返回的IC卡信息带到Java程序里来,返回值分散在多个变量里,没法直接通过一个函数返回值传回来,google了一整,例子全从java向C++方向传参的,最后在官方文档里找到解决方案:将返回值赋值给一个对象属性,将该对象作为函数的参数传进dll的方法中即可。方法如下:

/*
obj需要赋值的对象
fieldName属性名
fieldType 属性签名(可通过在控制台javap -s [类全名]得到)
value 属性值
*/

int setObjectField(JNIEnv* env,jobject obj,char *fieldName,char *fieldType,char *value){
jfieldID fid; /* store the field ID */
jstring jstr;

/* Get a reference to obj’s class */
jclass cls = env->GetObjectClass(obj);
/* Look for the instance field s in cls */
fid = env->GetFieldID( cls, fieldName,
fieldType);
if (fid == NULL) {
return -1; /* failed to find the field */
}

/* Create a new string and overwrite the instance field */
jstr=stringTojstring(env,value);

if (jstr == NULL) {
return -1; /* out of memory */
}
env->SetObjectField( obj, fid, jstr);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值