现在的位置: 首页 > 综合 > 正文

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

2013年08月19日 ⁄ 综合 ⁄ 共 3562字 ⁄ 字号 评论关闭

(以下方法我在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()"));

【上篇】
【下篇】

抱歉!评论已关闭.