欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
做了兩天,用jni的一點(diǎn)感受

這幾天公司在搞一個(gè)與第三方的軟件結合,公司讓我去做。由于原來(lái)對VC不是很熟悉,所以做這個(gè)的編程痛苦指數是很高的。

這里用了兩種方式來(lái)做。需求是對本地文件的讀取,提取里面的信息。文件是按STRUCT寫(xiě)進(jìn)去的。所以是在VC里面用CFILE一次讀取一個(gè)STRUCT,然后再把讀到的信息進(jìn)行處理。

方案(1)

把讀到的信息接成一個(gè)字符串,返回給JAVA。這里有一個(gè)問(wèn)題,就是編碼的問(wèn)題,CString是用UNICODE編碼,JAVA是用UTF-8,在JAVA中無(wú)論怎么轉換都不行,所以最后是在VC里面多CString進(jìn)行轉換。

轉換代碼如下:

jstring WindowsTojstring( JNIEnv* env, char* str )
{
    jstring rtn = 0;
    int slen = strlen(str);
    unsigned short * buffer = 0;
    if( slen == 0 )
        rtn = (env)->NewStringUTF(str );
    else
    {
        int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
        buffer = (unsigned short *)malloc( length*2 + 1 );
        if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
            rtn = (env)->NewString(  (jchar*)buffer, length );
    }
    if( buffer )
        free( buffer );
    return rtn;
}

調用這方法的代碼是:

 char * temp=new char();
 temp=str.GetBuffer(str.GetLength());
 jstring sResult=WindowsTojstring(env,temp);

return sResult;

這樣返回到JAVA中文就能正確顯示了。

方案(2)

返回一個(gè)對象數組。

讀到一個(gè)STRUCT后把數據存到一個(gè)對象,這樣就能返回一個(gè)對象數組。這種方法比較正規,不需要在JAVA里對字符串進(jìn)行分割。

CString GetIPStr(DWORD ipAddr)
{
 CString sIP;
 in_addr addr;

 addr.S_un.S_addr = ipAddr;
 sIP.Format( "%d.%d.%d.%d",
   addr.S_un.S_un_b.s_b1,
   addr.S_un.S_un_b.s_b2,
   addr.S_un.S_un_b.s_b3,
   addr.S_un.S_un_b.s_b4);

 return sIP;
}

DWORD ip2dw(DWORD dw)
{
 CString sIP;
 in_addr addr;

 addr.S_un.S_addr = dw;
 BYTE b1=addr.S_un.S_un_b.s_b1;
 BYTE b2=addr.S_un.S_un_b.s_b2;
 BYTE b3=addr.S_un.S_un_b.s_b3;
 BYTE b4=addr.S_un.S_un_b.s_b4;
 DWORD ret=b1*256*256*256+b2*256*256+b3*256+b4;


 return ret;
}

jstring WindowsTojstring( JNIEnv* env, char* str )
{
    jstring rtn = 0;
    int slen = strlen(str);
    unsigned short * buffer = 0;
    if( slen == 0 )
        rtn = (env)->NewStringUTF(str );
    else
    {
        int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
        buffer = (unsigned short *)malloc( length*2 + 1 );
        if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
            rtn = (env)->NewString(  (jchar*)buffer, length );
    }
    if( buffer )
        free( buffer );
    return rtn;
}

JNIEXPORT jobjectArray JNICALL Java_MyCome_getStructArray
  (JNIEnv *env, jobject _obj)
{
 jobjectArray args = 0;
 CFile file;
 int LogSize=sizeof(LOG_MSN);
 LOG_MSN log;
 CString strSQL;
 CString strFMT=_T("insertMSN ‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%d‘,‘%s‘,‘%s‘,‘%s‘,‘%u‘");
 CString str="";
 int i=0;//數組長(cháng)度

 if(file.Open("d:\\20050708.V04",CFile::modeRead|CFile::shareDenyNone))
 {


  // if(strDate!=_T("") && memcmp(listFile[i],strDate,strlen(listFile[i]))==0)
   // file.Seek(100+pos*LogSize,CFile::begin);
  // else
  int size=file.GetLength();
  i=(size-10)/LogSize;
  file.Seek(100,CFile::begin);
  jclass objClass = (env)->FindClass("java/lang/Object");

  //新建object數組
  args = (env)->NewObjectArray(i, objClass, 0);

  jobjectArray coppy=0;
  coppy=(env)->NewObjectArray(i,objClass,0);

  /**//* 下面為獲取到Java中對應的實(shí)例類(lèi)中的變量*/

  //獲取Java中的實(shí)例類(lèi)
  jclass objectClass = (env)->FindClass("LOG_MSN");

  jfieldID capTrue = (env)->GetFieldID(objectClass,"tmCapture","Ljava/lang/String;");
  jfieldID user = (env)->GetFieldID(objectClass,"sUser","Ljava/lang/String;");
  jfieldID srcMac = (env)->GetFieldID(objectClass,"sSrcMac","Ljava/lang/String;");
  jfieldID pcName = (env)->GetFieldID(objectClass,"sPcName","Ljava/lang/String;");
  jfieldID srcAddr = (env)->GetFieldID(objectClass,"dwSrcAddr","Ljava/lang/String;");
  jfieldID dstAddr = (env)->GetFieldID(objectClass,"dwDstAddr","Ljava/lang/String;");
  jfieldID ID = (env)->GetFieldID(objectClass,"sID","Ljava/lang/String;");
  jfieldID styles = (env)->GetFieldID(objectClass,"style","Ljava/lang/String;");
  jfieldID content = (env)->GetFieldID(objectClass,"sContent","Ljava/lang/String;");
  jfieldID address = (env)->GetFieldID(objectClass,"sAddress","Ljava/lang/String;");


   int account=0;
   char * pcappoint;
   char * pcontent;
   while(file.Read(&log,LogSize)==(DWORD)LogSize)
   {
       //1
    pcappoint=new char();
   //  str = (*env)->NewStringUTF( env, sa[i] );
    CString capstr=log.tmCapture.Format("%Y-%m-%d %H:%M:%S");
    //CString capstr=new CString("abc");
    pcappoint=capstr.GetBuffer(capstr.GetLength());
    jstring jcap = WindowsTojstring(env,pcappoint);
    (env)->SetObjectField(_obj,capTrue,jcap );
    
    //2
    char * puser=new char();
    CString cuser=log.sUser;
    puser=cuser.GetBuffer(cuser.GetLength());
    jstring juser = WindowsTojstring(env,puser);
    juser = WindowsTojstring(env,puser);
    (env)->SetObjectField(_obj,user,juser );
    //3
    char * psrcMac=new char();
    CString csrcMac=log.sSrcMac;
     psrcMac=csrcMac.GetBuffer(csrcMac.GetLength());
    jstring jsrcMac = WindowsTojstring(env,psrcMac);
    (env)->SetObjectField(_obj,srcMac,jsrcMac );
    //4
    char * ppcName=new char();
    CString cpcName=log.sPcName;
    ppcName=cpcName.GetBuffer(cpcName.GetLength());
    jstring jcpcName = WindowsTojstring(env,ppcName);
    (env)->SetObjectField(_obj,pcName,jcpcName );
    //5
    char * psrcAddr=new char();
    CString csrcAddr=GetIPStr(log.dwSrcAddr);
    psrcAddr=csrcAddr.GetBuffer(csrcAddr.GetLength());
    jstring jsrcAddr = WindowsTojstring(env,psrcAddr);
    (env)->SetObjectField(_obj,srcAddr,jsrcAddr );
    //6
    char * pDstAddr=new char();
    CString cDstAddr=GetIPStr(log.dwDstAddr);
    pDstAddr=cDstAddr.GetBuffer(cDstAddr.GetLength());
    jstring jcDstAddr = WindowsTojstring(env,pDstAddr);
    (env)->SetObjectField(_obj,dstAddr,jcDstAddr );
    //7
    char * pstyle=new char();
    CString cstyle=log.style;
    pstyle=cstyle.GetBuffer(cstyle.GetLength());
    jstring jstyles = WindowsTojstring(env,pstyle);
    (env)->SetObjectField(_obj,styles,jstyles );
    //8
    char * psID=new char();
    CString csID=log.sID;
    psID=csID.GetBuffer(csID.GetLength());
    jstring jsID= WindowsTojstring(env,psID);
    (env)->SetObjectField(_obj,ID,jsID );

    //9
    pcontent=new char();
    CString ccontent=log.sContent;
    pcontent=ccontent.GetBuffer(ccontent.GetLength());
    ccontent.ReleaseBuffer();
    jstring jcontent=WindowsTojstring(env,pcontent);
   // jstring jcontent=(env)->NewStringUTF(env, pcontent);
    (env)->SetObjectField(_obj,content,jcontent );
    //10
    char * pAddress=new char();
    CString cAddress= log.sAddress;
    pAddress=cAddress.GetBuffer(cAddress.GetLength());
    jstring jAddress= WindowsTojstring(env,pAddress);
    (env)->SetObjectField(_obj,address,jAddress );
    
    (env)->SetObjectArrayElement(args, account, _obj);
    account++;
   }
   file.Close();
 }

 //jstring sResult;
 //sResult=env->NewStringUTF(str);

 return args;

這個(gè)返回的是有對數組。不過(guò)這種方法現在還是有點(diǎn)問(wèn)題,應該是指針地址的問(wèn)題,最后面的對象會(huì )吧前面的對象覆蓋,造成數據重復。所以現在目前是采用第一種方案。哪位大哥如果能看出第二種方案的問(wèn)題,請跟我聯(lián)系,QQdanke 56355337

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
顯示本地ip CString 亂碼
ndk
CString 轉換為 string
JNI 數據類(lèi)型轉換
JNI入門(mén)
JNI相關(guān)類(lèi)型轉換
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久