“==” 和“equals”的区别:
- ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。即比较的是2个对象的地址。
- equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。即比较的是2个对象的内容。
显然,当equals为true时,==不一定为true。
例如:String a = new String("test"); String b = new String("test");
a.equals(b)返回true
a == b返回falseJNI调用问题:C++调用JAVA,long类型不匹配:
- 问题来源:
void JNITest::JNITestLong(long time){ LOGD("JNITestLong time: %ld", time); JNIEnv *env; m_pVM->AttachCurrentThread(&env, NULL); jmethodID WGShowFullScreenAD = env->GetStaticMethodID(s_JNITestClass, "WGShowFullScreenAD", "(J)V"); env->CallStaticVoidMethod(s_JNITestClass, JNITestLong, time); }
欲调用的JAVA函数为:
public static void JNITestLong(long time)
此时传入参数long time = 1000,打印:
传入C++的参数为:time: 1000
而传到JAVA时,参数变为:time 290339790646064
显然发生了错误,那这是什么原因导致的呢?原因:
在C++里long类型的字节数,是根据平台而定,具体可参见:https://www.assembla.com/spaces/zsync-windows/wiki/Types_sizes,因为程序是跑在安卓机器上,而目前安卓机器大部分都是32位机,所以这里C++函数中的long参数是32位,占4个字节。而JAVA是跨平台语言,long类型均为64位,即8个字节。由此发生了类型不匹配的问题,导致了以上问题的发生。解决办法:
让C++和JAVA的参数字节对齐,将JAVA的参数改为int类型,或者将C++的参数改为long long类型。考虑到后续会有64位的安卓机,long long类型在32位和64位机上均是8个字节,所以将C++中的参数改为long long 类型更加合理,即:
void JNITest::JNITestLong(long long time){ LOGD("JNITestLong time: %lld", time); JNIEnv *env; m_pVM->AttachCurrentThread(&env, NULL); jmethodID WGShowFullScreenAD = env->GetStaticMethodID(s_JNITestClass, "WGShowFullScreenAD", "(J)V"); env->CallStaticVoidMethod(s_JNITestClass, JNITestLong, time); }
运行后结果正确,搞定!
- 3.