您的位置:首页 > 其它

2nd下J2ME安装研究和启动方法

2009-02-23 21:56 351 查看
(以下方法我在6680和n70上通过测试)

2nd下
每个J2ME程序安装后都会将安装文件放到C:/system/midlets/下,如TellSymbianILoveU.jar的安装会生成如下文件
C:/system/midlets/[10131ab7]/dump
C:/system/midlets/[10131ab7]/TellSymbianILoveU.jad
C:/system/midlets/[10131ab7]/TellSymbianILoveU.jar
C:/system/midlets/[10131ab7]/uids
其中10131ab7是uid,是symbian系统随机生成的.
该文件夹下的uids文件内容如下
B71A1310977D1910
其中前8个两两倒叙就是这里的[10131ab7],而后8个就是在C:/system/apps/下的UID: 10197d97
在C:/system/apps/下可以找到如下文件夹
C:/system/apps/[10197d97]/[10197d97].aif
C:/system/apps/[10197d97]/[10197d97].app
C:/system/apps/[10197d97]/[10197d97].bin
C:/system/apps/[10197d97]/[10197d97].txt
这里的[10197d97]就是之前的uids文件的后8位
所以可以猜测uids是一个uid映象文件,它将C:/system/midlets/下的jar文件和C:/system/apps/下的app文件一一对应

这样我们要在2nd下启动已安装的J2ME程序就可以这样得到文件路径了
先扫描C:/system/midlets/,找到和我们的J2ME程序在同一目录下的uids文件,读取该文件的后8位的UID,然后将该UID组合成app文件的路径
(这里我以我的J2ME程序名为TellSymbianILoveU.jar为例)

这个过程挺麻烦的

void GetAppFilePath(TDes& aPath)
{
RLog::Log(_L("In GetAppFilePath()"));

_LIT(KJarFile,"TellSymbianILoveU.jar");
_LIT(KAppPath,"C://system//apps//[");

#ifndef __WINS__
_LIT(KMidlPath,"C://system//midlets//"); //for real device
#else
_LIT(KMidlPath,"C://logs//"); //for win
#endif

//获取uids文件的路径
CDirScan* ds = CDirScan::NewLC(iCoeEnv->FsSession());
TRAPD(err,ds->SetScanDataL(KMidlPath,KEntryAttNormal,ESortByName|EAscending,CDirScan::EScanDownTree));
if (err!=KErrNone)
{
CleanupStack::PopAndDestroy(ds);
return;
}

CDir* c = NULL;
TFileName fullname;
TBuf<100> jarPath;
while(1)
{

ds->NextL(c);
if (!c)
break;

for (TInt i=0; i<c->Count(); i++)
{
const TEntry e= (*c)[i];

fullname.Copy(ds->FullPath());
fullname.Append(e.iName);

TParsePtrC p(fullname);
if(!p.NameAndExt().Compare(KJarFile))
{
RLog::Log(fullname);
RLog::Log(p.NameAndExt());
jarPath.Copy(p.Path());
}

}
delete c;
c=NULL;
}

CleanupStack::PopAndDestroy(ds);

//读uids
RLog::Log(_L("jarPath"));
RLog::Log(jarPath); //这里得到的值为 "/system/midlets/[10131ab7]/"

TBuf<100> uidsPath;
uidsPath.Append(_L("C:"));
uidsPath.Append(jarPath);
uidsPath.Append(_L("uids"));

RLog::Log(uidsPath); //到这里能正确得到C:/system/midlets/[10131ab7]/uids

TInt fileLength;
RFs fs;
RFile file;
fs.Connect();

file.Open(fs,uidsPath,EFileRead);
file.Size(fileLength);

RLog::Log(_L("fileLength"),fileLength);

HBufC8* heapBuf = HBufC8::NewLC(fileLength);
TPtr8 uids = heapBuf->Des();
file.Read(uids,fileLength);
RLog::Log(uids);

file.Close();
fs.Close();
//获取UID值
TBuf<8> uidBuf;
TInt i=0;
for (i=7;i>3;i--)
{
TInt aInt=0;
aInt=(TInt)uids[i];
RLog::Log(_L("aInt"),aInt);
TInt value=aInt/16;
uidBuf.Append(itoa(value));
value=aInt%16;
uidBuf.Append(itoa(value));
}

CleanupStack::PopAndDestroy();//heapBuf

RLog::Log(uidBuf); //得到10197d97

TBuf<100> appPath;
appPath.Append(KAppPath);
appPath.Append(uidBuf);
appPath.Append(_L("]//["));
appPath.Append(uidBuf);
appPath.Append(_L("].app"));

aPath.Copy(appPath);
RLog::Log(aPath); //得到C:/system/apps/[10197d97]/[10197d97].app

return;

}

TChar itoa(TInt aInt)
{
if(aInt<0||aInt>15)
{
RLog::Log(_L("EEROR in itoa"),aInt);
return aInt;
}
switch(aInt)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
return aInt + 48;
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
return aInt + 87;
}
}

void DoLaunchL() //
{
RLog::Log(_L(" IN DoLaunchL()"));

TBuf<100> path;
path.Copy(_L8("err"));
GetAppFilePath(path);

//启动
CApaCommandLine* cmdLine=CApaCommandLine::NewLC();
cmdLine->SetLibraryNameL( path );
cmdLine->SetCommandL( EApaCommandRun );
RApaLsSession ls;
User::LeaveIfError( ls.Connect() );
CleanupClosePushL(ls);
User::LeaveIfError( ls.StartApp(*cmdLine) );
CleanupStack::PopAndDestroy( 2 ); // ls ,cmdLine

RLog::Log(_L("END DoLaunchL()"));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: