Add class ResStringPool
This commit is contained in:
parent
bf9b270775
commit
8a2cdbe47e
|
|
@ -20,7 +20,7 @@ void (*ResXMLParser_restart)(void *);
|
||||||
|
|
||||||
int32_t (*ResXMLParser_getAttributeNameID)(void *, int);
|
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() {
|
bool prepareSymbols() {
|
||||||
void *fwHandle = dlopen(kLibFwPath, RTLD_LAZY | RTLD_GLOBAL);
|
void *fwHandle = dlopen(kLibFwPath, RTLD_LAZY | RTLD_GLOBAL);
|
||||||
|
|
@ -51,7 +51,7 @@ bool prepareSymbols() {
|
||||||
LOGE("can't get ResXMLParser_getAttributeNameID: %s", dlerror());
|
LOGE("can't get ResXMLParser_getAttributeNameID: %s", dlerror());
|
||||||
return false;
|
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,
|
fwHandle,
|
||||||
#if defined(__LP64__)
|
#if defined(__LP64__)
|
||||||
"_ZNK7android13ResStringPool8stringAtEmPm"
|
"_ZNK7android13ResStringPool8stringAtEmPm"
|
||||||
|
|
@ -122,7 +122,7 @@ void XResources_rewriteXmlReferencesNative(JNIEnv *env, jclass,
|
||||||
// only replace attribute name IDs for app packages
|
// only replace attribute name IDs for app packages
|
||||||
if (attrNameID >= 0 && (size_t)attrNameID < mTree.mNumResIds && dtohl(mResIds[attrNameID]) >= 0x7f000000) {
|
if (attrNameID >= 0 && (size_t)attrNameID < mTree.mNumResIds && dtohl(mResIds[attrNameID]) >= 0x7f000000) {
|
||||||
size_t attNameLen;
|
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,
|
jint attrResID = env->CallStaticIntMethod(classXResources, methodXResourcesTranslateAttrId,
|
||||||
env->NewString((const jchar*)attrName, attNameLen), origRes);
|
env->NewString((const jchar*)attrName, attNameLen), origRes);
|
||||||
if (env->ExceptionCheck())
|
if (env->ExceptionCheck())
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,23 @@ public:
|
||||||
const void* mCurExt;
|
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
|
class ResXMLTree : public ResXMLParser
|
||||||
{
|
{
|
||||||
|
|
@ -90,7 +107,7 @@ public:
|
||||||
const void* mHeader;
|
const void* mHeader;
|
||||||
size_t mSize;
|
size_t mSize;
|
||||||
const uint8_t* mDataEnd;
|
const uint8_t* mDataEnd;
|
||||||
void* mStrings;
|
ResStringPool mStrings;
|
||||||
const uint32_t* mResIds;
|
const uint32_t* mResIds;
|
||||||
size_t mNumResIds;
|
size_t mNumResIds;
|
||||||
const ResXMLTree_node* mRootNode;
|
const ResXMLTree_node* mRootNode;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue