安卓编程易混淆点 持续更新中

  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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值