关于java调用c动态库的问题
各位大牛好:
小弟是新手,在这里遇到了一个问题,不知道如何解决,希望大家抽点时间帮帮忙,谢谢了
问题如下:
我在用java调用C的动态库,这期间java传了一个jstring类型的参数给c,但c这边接收到为乱码,我从网上查看了一些资料,就是jstring转为char *,但代码加进去的时候,总有函数不能用,提示没定义,但我已经引入了jni.h头文件,还是不行,并且我是用别人的环境运行的,感觉也不能老占用别人时间,所以想快点解决,可是现在不知如何办了,望各位能给些意见。
网上提供的转换代码(其中之一):
JNIEXPORT jstring JNICALL Java_com_wws_android_util_MD5Util_Md5(JNIEnv *env, jclass jcl, jstring encryptKey)
{
char szDigest[16];
int i;
char* t;
t = (char*)env->GetStringUTFChars(encryptKey,0);
system(t);
MD5Digest((char *)t,strlen(t),szDigest);
for (i=0;i<16;i++)
{
sprintf(str+(2*i), "%02x", (unsigned char)szDigest[i]);
}
return (*env)->NewStringUTF(env, str);
}
[解决办法]
换成下面这个试下
//工具方法 : 把java中的string 转化成 c语言中 char数组
//返回值是 char数组的首地址
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String");
jstring strencode = (*env)->NewStringUTF(env, "utf-8");
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",
"(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid,
strencode); // String .getByte("utf-8");
jsize alen = (*env)->GetArrayLength(env, barr);
jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
if (alen > 0) {
rtn = (char*) malloc(alen + 1); //"\0"
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
(*env)->ReleaseByteArrayElements(env, barr, ba, 0); //释放空间
return rtn;
}