Symbian
Symbian OS Library

FAQ-0298 How do I convert an 8-bit descriptor to a Java string?

[Index][spacer] [Previous] [Next]



 

Classification: Java Category: JNI
Created: 10/12/99 Modified: 07/03/2001
Number: FAQ-0298
Platform: Not Applicable

Question:
How do I convert an 8-bit descriptor to a Java string?

Answer:
To get a jstring (which can be returned to the Java side) from a TPtr8 (or TBuf8) descriptor, you can use the following code:
    TPtr8 buf;
    ...
    const TText8* ptr = buf.PtrZ();
    jstring str = aJNI->NewStringUTF(REINTERPRET_CAST(const char*, ptr));

If you have a TPtrC or a TBufC descriptor, you will not be able to access the PtrZ() method directly, but you can do this through an intermediate TPtr8 as follows:

    TPtrC8 bufC;
    ...
    TPtr8 buf = bufC.Des()
    const TText8* ptr = buf.PtrZ();
    jstring str = aJNI->NewStringUTF(REINTERPRET_CAST(const char*, ptr));

Similarly for an HBufC8 heap descriptor:

    HBufC8* bufC;
    ...
    TPtr8 buf = bufC->Des();
    const TText8* ptr = buf->PtrZ();
    jstring str = aJNI->NewStringUTF(REINTERPRET_CAST(const char*, ptr));


Notes:

    1. The PtrZ() serves to append a null terminator to the string to which it is applied and return a const pointer to unsigned data. You must ensure that there is enough space in the buffer for the null to be appended, other a User 23 Panic will occur.

    2. The REINTERPRET_CAST is necessary because ptr is a pointer to unsigned data whereas the constructor for a Java string requires a pointer to (null-terminated) signed data.

    3. If the EPOC descriptor contains cp1252 special characters, the conversion should be done via an intermediate 16-bit buffer descriptor. The details of how to do this under ER5 are given in the following KB entry dealing with conversion in the opposite direction. The further conversion from a 16-bit descriptor to a Java string is described here .