Add class ResStringPool

This commit is contained in:
solohsu 2019-04-22 18:54:59 +08:00
parent bf9b270775
commit 8a2cdbe47e
2 changed files with 24 additions and 7 deletions

View File

@ -20,7 +20,7 @@ void (*ResXMLParser_restart)(void *);
int32_t (*ResXMLParser_getAttributeNameID)(void *, int);
char16_t *(*ResStringPool_stringAt)(void *, int32_t, size_t *);
char16_t *(*ResStringPool_stringAt)(const void *, int32_t, size_t *);
bool prepareSymbols() {
void *fwHandle = dlopen(kLibFwPath, RTLD_LAZY | RTLD_GLOBAL);
@ -51,7 +51,7 @@ bool prepareSymbols() {
LOGE("can't get ResXMLParser_getAttributeNameID: %s", dlerror());
return false;
}
ResStringPool_stringAt = reinterpret_cast<char16_t *(*)(void *, int32_t, size_t *)>(dlsym(
ResStringPool_stringAt = reinterpret_cast<char16_t *(*)(const void *, int32_t, size_t *)>(dlsym(
fwHandle,
#if defined(__LP64__)
"_ZNK7android13ResStringPool8stringAtEmPm"
@ -122,7 +122,7 @@ void XResources_rewriteXmlReferencesNative(JNIEnv *env, jclass,
// only replace attribute name IDs for app packages
if (attrNameID >= 0 && (size_t)attrNameID < mTree.mNumResIds && dtohl(mResIds[attrNameID]) >= 0x7f000000) {
size_t attNameLen;
const char16_t* attrName = ResStringPool_stringAt(mTree.mStrings, attrNameID, &attNameLen);
const char16_t* attrName = ResStringPool_stringAt(&(mTree.mStrings), attrNameID, &attNameLen);
jint attrResID = env->CallStaticIntMethod(classXResources, methodXResourcesTranslateAttrId,
env->NewString((const jchar*)attrName, attNameLen), origRes);
if (env->ExceptionCheck())

View File

@ -78,6 +78,23 @@ public:
const void* mCurExt;
};
class ResStringPool
{
public:
int32_t mError;
void* mOwnedData;
const void* mHeader;
size_t mSize;
mutable pthread_mutex_t mDecodeLock;
const uint32_t* mEntries;
const uint32_t* mEntryStyles;
const void* mStrings;
char16_t mutable** mCache;
uint32_t mStringPoolSize; // number of uint16_t
const uint32_t* mStyles;
uint32_t mStylePoolSize; // number of uint32_t
};
class ResXMLTree : public ResXMLParser
{
@ -90,7 +107,7 @@ public:
const void* mHeader;
size_t mSize;
const uint8_t* mDataEnd;
void* mStrings;
ResStringPool mStrings;
const uint32_t* mResIds;
size_t mNumResIds;
const ResXMLTree_node* mRootNode;