安卓程式設計易混淆點 持續更新中
阿新 • • 發佈:2019-02-08
“==” 和“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.