android ndk 中,java的string传到c++的char*再传回来,输出我看到是一样的,但是系统判断不一样,原因?
c++部分JNIEXPORTjstringJNICALLJava_com_……_MainActivity_rib(JNIEnv*env,jobjectthiz,jstri...
c++部分
JNIEXPORT jstring JNICALL Java_com_……_MainActivity_rib(JNIEnv *env, jobject thiz, jstring x)
{
char* name = Jstring2CStr(env,x);
return env->NewStringUTF(name);//C++语法
}
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = "";
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);//String.getByte("GB2312");
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1);//new char[alen+1]; "\0"
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
env->ReleaseByteArrayElements(barr,ba,0); //释放内存
return rtn;
}
java部分:
String a = rib("ceshi");
if(a == "ceshi")
……
else
……
结果一直输出else里面的代码,我输出看结果确实是"ceshi",为什么系统一直判断不正确呢? 展开
JNIEXPORT jstring JNICALL Java_com_……_MainActivity_rib(JNIEnv *env, jobject thiz, jstring x)
{
char* name = Jstring2CStr(env,x);
return env->NewStringUTF(name);//C++语法
}
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = "";
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);//String.getByte("GB2312");
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1);//new char[alen+1]; "\0"
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
env->ReleaseByteArrayElements(barr,ba,0); //释放内存
return rtn;
}
java部分:
String a = rib("ceshi");
if(a == "ceshi")
……
else
……
结果一直输出else里面的代码,我输出看结果确实是"ceshi",为什么系统一直判断不正确呢? 展开
展开全部
Java中字符串的比较须要用equals函数:
String a = rib("ceshi");
if( a.equals("ceshi") )
{
// ... 相同
}
else
{
// ... 不相同
}
更多追问追答
追问
但是如果c++去判断值也有问题:
JNIEXPORT……_rib(……, jstring x)
{
char* name = Jstring2CStr(env,x);
if(name == "ceshi") ……
else ……
}
c++也判断为不是"ceshi",执行了 else里面的,这个能否解决?
追答
C++判断需要用 strcmp 函数:
#include <string.h>
char * a = "ceshi";
if( 0 == strcmp(a, "ceshi") )
{
// ... 相同
}
else
{
// ... 不相同
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a.equals("ceshi")
别用等号 比较字符串啊。
别用等号 比较字符串啊。
更多追问追答
追问
但是如果c++去判断值也有问题:
JNIEXPORT……_rib(……, jstring x)
{
char* name = Jstring2CStr(env,x);
if(name == "ceshi") ……
else ……
}
c++也判断为不是"ceshi",执行了 else里面的,这个能否解决?
追答
if( strcmp(name,"ceshi") ==0 ){
//正确
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if(a == "ceshi")改成
if(a.equals("ceshi"))
if(a.equals("ceshi"))
追问
a.equals("ceshi")可以使用,感谢您的帮助!
但是如果c++去判断值也有问题:
JNIEXPORT……_rib(……, jstring x)
{
char* name = Jstring2CStr(env,x);
if(name == "ceshi") ……
else ……
}
c++也判断为不是"ceshi",执行了 else里面的,这个能否解决?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询