1. 程式人生 > >安卓程式設計易混淆點 持續更新中

安卓程式設計易混淆點 持續更新中

  1. “==” 和“equals”的區別:

    • ==操作比較的是兩個變數的值是否相等,對於引用型變量表示的是兩個變數在堆中儲存的地址是否相同,即棧中的內容是否相同。即比較的是2個物件的地址。
    • equals操作表示的兩個變數是否是對同一個物件的引用,即堆中的內容是否相同。即比較的是2個物件的內容。

    顯然,當equals為true時,==不一定為true。
    例如:

    String  a = new String("test");
    String b = new String("test");

    a.equals(b)返回true
    a == b返回false

  2. JNI呼叫問題: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. 3.