首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

关于java调用c动态库的有关问题

2012-12-24 
关于java调用c动态库的问题各位大牛好:小弟是新手,在这里遇到了一个问题,不知道如何解决,希望大家抽点时间

关于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;
}

[解决办法]
得看什么函数没有定义,报什么错,字符串从java层传递给native层可以使用一些native函数进行转换,函数有如下几个:
NewString
GetStringLength 
GetStringChars
ReleaseStringChars 
NewStringUTF
GetStringUTFLength 
GetStringUTFChars
ReleaseStringUTFChars
GetStringRegion
GetStringUTFRegion
GetStringCritical
Release StringCritical
[解决办法]
没人来看,不过已经解决了
错误主要出现在这一行
t = (char*)env->GetStringUTFChars(encryptKey,0);
因为c里面必须用(*env)->,而cpp里才写成env->,并且以里面函数参数也不一样,应写成
t = (*env)->GetStringUTFChars(env,encryptKey,0);
这样就得到解决了

热点排行