各位大牛好:
    小弟是新手,在这里遇到了一个问题,不知道如何解决,希望大家抽点时间帮帮忙,谢谢了
问题如下:
    我在用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);
}

解决方案 »

  1.   

    换成下面这个试下
    //工具方法 : 把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;
    }
      

  2.   

    得看什么函数没有定义,报什么错,字符串从java层传递给native层可以使用一些native函数进行转换,函数有如下几个:
    NewString
    GetStringLength 
    GetStringChars
    ReleaseStringChars 
    NewStringUTF
    GetStringUTFLength 
    GetStringUTFChars
    ReleaseStringUTFChars
    GetStringRegion
    GetStringUTFRegion
    GetStringCritical
    Release StringCritical
      

  3.   

    没人来看,不过已经解决了
    错误主要出现在这一行
    t = (char*)env->GetStringUTFChars(encryptKey,0);
    因为c里面必须用(*env)->,而cpp里才写成env->,并且以里面函数参数也不一样,应写成
    t = (*env)->GetStringUTFChars(env,encryptKey,0);
    这样就得到解决了