Skip to main content

Simple example of strong and weak pointers on Android using RefBase class

Here is a simple example explaining the usage of strong and weak pointers using android's RefBase class and the Android.mk to compile the same. Its a modified version of code written by Daniel in the following link.


strong_pointer.cpp file: 

#include <stdio.h>
#include "utils/RefBase.h"

namespace android { 
class RefTest : public RefBase {
public:
    RefTest(int32_t id) : mID(id) {
        printf("RefTest ctor: %d\n", mID);
    }
    virtual ~RefTest() {
        printf("RefTest dtor: %d\n", mID);
    }
    int32_t id() const {
        return mID;
    }
private:
    int32_t mID;
};

int strong_pointer() {
    sp<RefTest> ref1 = new RefTest(1);
    sp<RefTest> ref5;

    {
    sp<RefTest> ref2 = new RefTest(2);
    ref5 = ref2; // comment this out and check when the destructor of ref2 is called
    }
    wp<RefTest> ref3 = ref1;
    sp<RefTest> ref4 = ref3.promote();
    if (ref4 == NULL) {
        printf("RefTest object is destroyed\n");
    } else {
        printf("RefTest object %d is still around\n",
            ref4->id());
    }
    ref4 = NULL;
    ref1 = NULL; // comment this out to check to check change in prints
    ref4 = ref3.promote();
    if (ref4 == NULL) {
        printf("RefTest object is destroyed\n");
    } else {
        printf("RefTest object %d is still around\n",
            ref4->id());
    }
    printf("Before return \n"); 
    return 0;
}
}

int main()
{
    android::strong_pointer();
    return 0;
}

Android.mk file:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:=                       \
        strong_pointer.cpp            

LOCAL_MODULE:= strong_pointer

LOCAL_SHARED_LIBRARIES := \
        libutils    \

LOCAL_MODULE_TAGS := optional

LOCAL_C_INCLUDES := \
        frameworks/native/include \

include $(BUILD_EXECUTABLE)


Comments

Post a Comment

Popular posts from this blog

Getting and Setting Microphone Gain or Microphone Boost on Windows 7 / 8 Programmatically

After hours of searching the net I have finally figured out a way to programmatically get and set the microphone gain (boost) value. The code mentioned below can be built on VS and does the job of setting gain value. #include "stdafx.h" #include <mmdeviceapi.h> #include <endpointvolume.h> #include <Functiondiscoverykeys_devpkey.h> #include "Audioclient.h" #include "comutil.h" #define EXIT_ON_ERROR(hres)   if (FAILED(hres)) { goto Exit; } #define SAFE_RELEASE(punk)   if ((punk) != NULL)  { (punk)->Release(); (punk) = NULL; } HRESULT getMicrophoneBoostVolumeLevel(IMMDevice *pEndptDev, IAudioVolumeLevel** ppVolumeLevel) { HRESULT hr = S_OK; DataFlow flow; IDeviceTopology *pDeviceTopology = NULL; IConnector *pConnFrom = NULL; IConnector *pConnTo = NULL; IPart *pPartPrev = NULL; IPart *pPartNext = NULL; *ppVolumeLevel = NULL; wchar_t microphoneBoostName[] = L"Microphone Boost";//if your system ...

AES-CBC-CTS Decryption using OpenSSL

Recently I was testing few test streams encrypted with AES-CBC-CTS mode, which is another block cipher mode that allows encrypting of data that is not evenly divisible into blocks (unlike AES-CBC mode). I also found that decryption of such streams is not possible using OpenSSL, as it does not support this block cipher mode. Since OpenSSL does support encryption/decryption for AES-CBC mode, I decided to extend this logic to support AES-CBC-CTS mode. I found following article on wikipedia which explains CBC-CTS encryption/decryption in detail. http://en.wikipedia.org/wiki/Ciphertext_stealing#CBC_ciphertext_stealing_decryption_using_a_standard_CBC_interface . Following C Routine can be used to decrypt data encrypted with AES-CBC-CTS block cipher mode. _DecryptData(DRM_KeyCtx_T  KEY_CTX, // KeyCtx_T is a structure containing the Key and IV.                      UINT8 *data, // ...