Android中JNI调用–文件操作

JNI 是 Java Native Interface 的缩写,译为 Java 本地接口。它允许 Java 代码和其他语言编写的代码进行交互。在android 中提供 JNI 的方式,让 Java 程序可以调用 C/C++语言程序。 android 中很多 Java 类都具有 native 接口,这些接口由本地实现,然后注册到系统中。


1、开发环境

Windows xp sp3 +MyEclipse 8.6+android2.3.3+jdk1.6+Android-ndk-r6b

2、JNI概述

JNI 是 Java Native Interface 的缩写,译为 Java 本地接口。它允许 Java 代码和其他语言编写的代码进行交互。在android 中提供 JNI 的方式,让 Java 程序可以调用 C/C++语言程序。 android 中很多 Java 类都具有 native 接口,这些接口由本地实现,然后注册到系统中。在android系统中实现JNI库需要连接.so共享库,如:lib<文件名>.so。

3、Android NDK概述

Android NDK是一个工具集,让你的Android应用程序里可以内嵌使用本地代码(C/C++)的组件。
Android应用程序运行在Dalvik虚拟机中。NDK可以让你使用C/C++这样的本地代码语言来实现你的应用程序中某些部分。这对某类程序是有帮助的,比如需要重用已有的C代码,或者为了提高运行速度

NDK 提供:
– 编译文件和工具集,用来将你的C/C++源文件编译成本地库。
– 提供一种方式,将对应的本地库内嵌到应用程序包文件(.apk)中,最终发布到Android设备中。
– 本地系统头文件和库,这些头文件和库从Android1.5开始往后都是被支持的。但使用本地活动(native activity)的程序只能运行在Android 2.3或更高的系统中。
– 文档、示例、指南。

4、JNI调用流程图


5、java调用Native

Android虚拟机允许你的应用程序源代码通过JNI调用实现本地代码的方法,需要在应用程序中使用关键字native声明一个或多个方法表明该方法是通过本地调用实现的,如:

public native static int FileOpen(StringpFileName,int openMode);
public native static int FileLength(int fp);
public native static int FileSeek(int fp,int offset,int origin);
public native static CusBuffer FileRead(int fp,int nCount);
public native static int FileWrite(int fp,byte[] buf,int nCount);
public native static int FileClose(int fp);

除了声明native方法以外还必须为这些方法实现提供本地共享库,该共享库最终会被打包到.apk文件中,这些共享库需要更具标准的unix公约来命名lib<文件名>.so,如:libJNI_FileSys.so,其中JNI_FileSys使我们需要加载的库名。在应用程序中加载共享库的方法为:

static{
    System.loadLibrary("JNI_FileSys");
}

注:这里使用的文件名不需要lib前缀以及.so后缀名。

FileSys.java完整代码实现:

package com.luoxudong.jni.reader;
import com.luoxudong.jni.bean.CusBuffer;
    
/********************************************************************
* [Summary]
    
*   TODO 文件操作类
* [Remarks]
*   TODO 请在此处详细描述类的功能、调用方法、注意事项、以及与其它类的关系.
 ********************************************************************/
public class FileSys {
static{
    System.loadLibrary("JNI_FileSys");
}
    
/**
 *
 * [Summary]
 *   MjFileOpen 打开文件
 * @param strFileName 文件名
 * @param openMode 打开类型
 * @return 结果
 *
 */
public int MjFileOpen(String strFileName,int openMode){
    return FileOpen(strFileName, openMode);
}

/**
 *
 * [Summary]
 *   MjFileLength 计算文件长度
 * @param fp 文件句柄
 * @return 文件长度
 *
 */
public int MjFileLength(int fp){
    return FileLength(fp);
}
    
/**
 *
 * [Summary]
 *   MjFileSeek 文件seek操作
 * @param fp 文件句柄
 * @param offset 读取数据偏移量
 * @param origin 开始位置指针
 * @return
 *
 */
public int MjFileSeek(int fp,int offset,int origin){
	return FileSeek(fp, offset, origin);
} 

/**
 *
 * [Summary]
 *   MjFileRead 读取文件数据
 * @param fp 文件句柄
 * @param nCount 读取字节数
 * @return 实际读取字节数
 *
 */
public CusBuffer MjFileRead(int fp,int nCount){
   return FileRead(fp, nCount);
}

/**
 *
 * [Summary]
 *   MjFileWrite 写文件
 * @param fp 文件句柄
 * @param buf 写数据buffer
 * @param nCount 需要写入的字节数
 * @return 实际写入字节数
 *
 */
public int MjFileWrite(int fp,byte[] buf,int nCount){
    return FileWrite(fp, buf, nCount);
}

/**
 *
 * [Summary]
 *   MjFileClose 关闭文件
 * @param fp 文件句柄
 * @return 关闭文件状态
 *
 */
public int MjFileClose(int fp){
	return FileClose(fp);
}

//本地调用
public native static int FileOpen(String pFileName,int openMode);
public native static int FileLength(int fp);
public native static int FileSeek(int fp,int offset,int origin);
public native static CusBuffer FileRead(int fp,int nCount);
public native static int FileWrite(int fp,byte[] buf,int nCount);
public native static int FileClose(int fp);
}

6、实现本地方法调用接口

为了方便我们可以使用javah命令先生成对应C/C++语言中的.h然后再实现这些函数。FileSys.java编译成FileSys.class文件后,使用命令(当前目录为工程bin目录下)javah -jni com.luoxudong.jni.reader.FileSys,此时会在bin目录下生成一个.h文件,文件名格式如下:com_luoxudong_jni_reader_FileSys.h,为了方便本人把文件名改成JNI_FileSys.h。
JNI_FileSys.h代码:

/* DO NOT EDIT THISFILE - it is machine generated */
#include<jni.h>
/* Header for classcom_meijin_dict_reader_FileSys */
    
#ifndef_Included_com_meijin_dict_reader_FileSys
#define_Included_com_meijin_dict_reader_FileSys
#ifdef __cplusplus
extern"C" {
#endif
    /*
    * Class:com_meijin_dict_reader_FileSys
    * Method:   FileOpen
    * Signature: (Ljava/lang/String;I)I
    */
    JNIEXPORT jintJNICALL Java_com_meijin_dict_reader_FileSys_FileOpen
      (JNIEnv *, jclass, jstring, jint);
    
    /*
    * Class:com_meijin_dict_reader_FileSys
    * Method:   FileLength
    * Signature: (I)I
    */
    JNIEXPORT jintJNICALL Java_com_meijin_dict_reader_FileSys_FileLength
      (JNIEnv *, jclass, jint);
    
    /*
    * Class:com_meijin_dict_reader_FileSys
    * Method:   FileSeek
    * Signature: (III)I
    */
    JNIEXPORT jintJNICALL Java_com_meijin_dict_reader_FileSys_FileSeek
      (JNIEnv *, jclass, jint, jint, jint);
    
    /*
    * Class:com_meijin_dict_reader_FileSys
    * Method:   FileRead
    * Signature:(II)Lcom/meijin/dict/bean/CusBuffer;
    */
    JNIEXPORT jobjectJNICALL Java_com_meijin_dict_reader_FileSys_FileRead
      (JNIEnv *, jclass, jint, jint);
    
    /*
    * Class:com_meijin_dict_reader_FileSys
    * Method:   FileWrite
    * Signature: (I[BI)I
    */
    JNIEXPORT jintJNICALL Java_com_meijin_dict_reader_FileSys_FileWrite
      (JNIEnv *, jclass, jint, jbyteArray, jint);
    
    /*
    * Class:com_meijin_dict_reader_FileSys
    * Method:   FileClose
    * Signature: (I)I
    */
    JNIEXPORT jintJNICALL Java_com_meijin_dict_reader_FileSys_FileClose
      (JNIEnv *, jclass, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

其中JNIEXPORT和JNICALL两个宏是JNI的关键字,表示该函数需要被JNI调用,而jint,jstring,jbyteArray是以JNI为中介使JAVA中对应类型与本地类型对接的类型,jobject为需要返回的java对象,类型对应表如下:

7、实现本地方法调用接口

根据对应的.h文件实现其接口。
JNI_FileSys.c代码:

#include"JNI_FileSys.h"
    #define LOG_TAG"JNI_FileSys"
    #define  LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
    #define  LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    #include<android/log.h>
    #include"FileSys.h"
    
    /*
    * Class:com_luoxudong_jni_reader_FileSys
    * Method:   FileOpen
    * Signature: ([BI)I
    */
    JNIEXPORT jintJNICALL Java_com_luoxudong_jni_reader_FileSys_FileOpen
      (JNIEnv *env, jclass jobj, jstring pFileName,jint openMode)
    {
      UINT8 *pbyFileName = (UINT8*)(*env)->GetStringUTFChars(env, pFileName, 0);
      LOGI("file name:%s---opentype:%d", pbyFileName, openMode);
      return FileOpen(pbyFileName,openMode);
    
    }
    
    /*
    * Class:com_luoxudong_jni_reader_FileSys
    * Method:   FileLength
    * Signature: (I)I
    */
    JNIEXPORT jintJNICALL Java_com_luoxudong_jni_reader_FileSys_FileLength
      (JNIEnv *env, jclass jobj, jint fd)
    {
      return FileLength(fd);
    }
    
    /*
    * Class:com_luoxudong_jni_reader_FileSys
    * Method:   FileSeek
    * Signature: (III)I
    */
    JNIEXPORT jintJNICALL Java_com_luoxudong_jni_reader_FileSys_FileSeek
      (JNIEnv *env, jclass jobj, jint fd, jintoffset, jint origin)
    {
    
      return FileSeek(fd, offset,origin);
    }
    
    /*
    * Class:com_luoxudong_jni_reader_FileSys
    * Method:   FileRead
    * Signature:(II)Lcom/luoxudong/jni/bean/CusBuffer;
    */
    JNIEXPORT jobjectJNICALL Java_com_luoxudong_jni_reader_FileSys_FileRead
      (JNIEnv *env, jclass jobj, jint fd, jintcount)
    {
      int nReadLen = 0;
      UINT8 *pBuf = (UINT8*)malloc(count);
      memset(pBuf, 0, count);
    
      nReadLen = FileRead(fd, pBuf,count);
    
      jbyte *pBy = (jbyte *)pBuf;
      jbyteArray jarray =(*env)->NewByteArray(env, nReadLen);
      (*env)->SetByteArrayRegion(env,jarray, 0, nReadLen, pBy);  
      jclassm_cls = (*env)->FindClass(env,"com/luoxudong/jni/bean/CusBuffer");
      jmethodID m_mid =(*env)->GetMethodID(env, m_cls, "<init>", "()V");
      jfieldID  m_fid1 = (*env)->GetFieldID(env, m_cls,"buffer", "[B");
      jfieldID  m_fid2 = (*env)->GetFieldID(env, m_cls,"nBufferLen", "I");
    
      jobject   m_obj = (*env)->NewObject(env, m_cls,m_mid);
      (*env)->SetObjectField(env,m_obj, m_fid1, jarray);
      (*env)->SetIntField(env, m_obj,m_fid2, nReadLen);
      return m_obj;
    }
    
    /*
    * Class:com_luoxudong_jni_reader_FileSys
    * Method:   FileWrite
    * Signature: (I[BI)I
    */
    JNIEXPORT jintJNICALL Java_com_luoxudong_jni_reader_FileSys_FileWrite
      (JNIEnv *env, jclass jobj, jint fd,jbyteArray buf, jint count)
    {
      jbyte *pjb = (jbyte*)(*env)->GetByteArrayElements(env, buf, 0);
      jsize len =(*env)->GetArrayLength(env, buf);
      UINT8 *byBuf = (UINT8 *)pjb;
      pjb[len] = '\0';
      return FileWrite(fd, byBuf,count);
    }
    
    /*
    * Class:com_luoxudong_jni_reader_FileSys
    * Method:   FileClose
    * Signature: (I)I
    */
    JNIEXPORT jintJNICALL Java_com_luoxudong_jni_reader_FileSys_FileClose
      (JNIEnv *env, jclass jobj, jint fd)
    {
      return FileClose(fd);
    }

其中头部定义了些andriod中日志输出所需要的宏,以及其他关联的.h文件,在一些地方C跟C++的使用语法不太一样,如在C中调用UINT8 pbyFileName = (UINT8)(*env)->GetStringUTFChars(env, pFileName, 0),
而C++中的语法为env-> (UINT8 *)GetStringUTFChars(pFileName,0)。

8、生成共享库

把编写好的各种相关联代码放在一个文件夹中,编写android.mk文件,使用ndk生成libJNI_FileSys.so文件。

会在libs\armeabi目录下生成.so文件

9、应用程序调用

把生成好的libJNI_FileSys.so文件放入java工程的libs目录下,就可以使用了


10、应用程序调用

当然在android下读写文件时还需要配置权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

10、运行效果

附上完整源代码: android JNI调用-文件操作

转载请指明出处:http://www.luoxudong.com/?p=1

有104人对 “Android中JNI调用–文件操作”留言了

  1. With havin so much content and articles do you ever run into any issues of plagorism or copyright
    violation? My website has a lot of unique content I’ve
    either authored myself or outsourced but it looks like a lot of it
    is popping it up all over the internet without my agreement.
    Do you know any methods to help protect against content from being
    ripped off? I’d truly appreciate it.

  2. Hi there to every body, it’s my first pay a quick
    visit of this website; this blog contains remarkable and in fact
    fine material for visitors.

  3. Hurrah, that’s what I was seeking for, what a
    material! present here at this web site, thanks admin of this
    web page.

  4. You really make it seem really easy along with your presentation however I to
    find this matter to be actually something which I think I’d never understand.
    It kind of feels too complicated and extremely wide for me.
    I am looking forward to your next publish, I’ll attempt to get the hold of it!

  5. Hi! I understand this is somewhat off-topic however I needed to
    ask. Does running a well-established website like
    yours take a massive amount work? I’m completely new
    to operating a blog but I do write in my journal on a daily basis.
    I’d like to start a blog so I will be able to share my experience and feelings
    online. Please let me know if you have any kind of ideas or tips for
    new aspiring blog owners. Appreciate it!

  6. Just want to say your article is as astounding. The clarity in your post is just cool and i could
    assume you’re an expert on this subject. Well with your permission allow
    me to grab your RSS feed to keep updated with forthcoming post.
    Thanks a million and please carry on the gratifying work.

  7. Hey there just wanted to give you a brief heads up and let you know a few of the images
    aren’t loading properly. I’m not sure why but I think its a linking
    issue. I’ve tried it in two different web browsers and both show the same
    results.

  8. Hi there, just became aware of your blog through Google,
    and found that it’s really informative. I’m gonna watch out for brussels.

    I’ll appreciate if you continue this in future.
    A lot of people will be benefited from your writing. Cheers!

  9. Way cool! Some extremely valid points! I appreciate you writing
    this write-up and the rest of the site is also really good.

  10. An impressive share! I’ve just forwarded this
    onto a colleague who had been doing a little research
    on this. And he in fact bought me lunch simply because I discovered it for him…
    lol. So let me reword this…. Thanks for the meal!! But
    yeah, thanx for spending time to talk about this issue here on your website.

  11. It’s very simple to find out any matter on net as compared
    to books, as I found this piece of writing at this site.

  12. After looking into a number of the blog posts on your website,
    I really appreciate your technique of writing a blog.
    I saved it to my bookmark website list and will be
    checking back in the near future. Take a look at
    my website as well and tell me your opinion.

  13. Definitely imagine that which you said. Your favourite reason appeared to be at the internet the simplest factor to consider of.

    I say to you, I definitely get annoyed even as other people think about worries that they just don’t understand
    about. You managed to hit the nail upon the highest as
    well as outlined out the whole thing with no need side-effects , other folks can take a signal.
    Will probably be back to get more. Thank you

  14. Simply wish to say your article is as surprising.

    The clarity to your publish is simply nice and i could think you’re an expert on this subject.
    Fine along with your permission let me to grasp your RSS feed to stay up
    to date with impending post. Thank you a million and please
    carry on the rewarding work.

  15. Excellent website. A lot of helpful information here. I’m sending it to some pals ans
    additionally sharing in delicious. And certainly, thanks for your sweat!

  16. Way cool! Some extremely valid points! I appreciate you penning this
    article and also the rest of the website
    is very good.

  17. I read this article completely concerning the resemblance of most recent and preceding
    technologies, it’s amazing article.

  18. Asking questions are genuinely nice thing if you are not understanding something entirely,
    but this piece of writing offers pleasant understanding
    yet.

  19. Hi there! I just wanted to ask if you ever have any
    problems with hackers? My last blog (wordpress) was hacked and
    I ended up losing months of hard work due to no back up.
    Do you have any methods to protect against hackers?

  20. Pretty nice post. I just stumbled upon your weblog and wished to say that I’ve really enjoyed surfing
    around your blog posts. In any case I’ll be subscribing to your
    rss feed and I hope you write again very soon!

  21. Hello there, I found your web site by means of Google while searching for
    a related subject, your site got here up, it appears to
    be like great. I’ve bookmarked it in my google bookmarks.

    Hello there, simply turned into alert to your weblog thru Google,
    and found that it is truly informative. I’m gonna watch out for brussels.
    I will appreciate if you happen to continue this in future.
    Numerous folks will be benefited from your writing.
    Cheers!

  22. magnificent publish, very informative. I wonder why the other specialists of this sector don’t understand this.
    You should continue your writing. I am confident,
    you’ve a huge readers’ base already!

  23. Everything is very open with a very clear clarification of the challenges.
    It was definitely informative. Your site is useful. Thank you
    for sharing!

  24. Fantastic beat ! I would like to apprentice while
    you amend your site, how could i subscribe for a blog website?
    The account aided me a acceptable deal. I had been a little bit acquainted of this your broadcast offered bright
    clear idea

  25. Everyone loves what you guys are usually up too.
    This kind of clever work and reporting! Keep up the terrific works guys I’ve incorporated
    you guys to blogroll.

  26. It’s actually very complex in this busy life to listen news on TV, thus I only use the
    web for that purpose, and take the most up-to-date information.

  27. Hello i am kavin, its my first time to commenting anywhere, when i read this piece of writing i
    thought i could also make comment due to this sensible article.

  28. We are a bunch of volunteers and opening a new scheme in our
    community. Your website offered us with valuable info to work on. You’ve performed
    an impressive activity and our whole neighborhood might be thankful to you.

  29. Greate pieces. Keep writing such kind of info on your blog.
    Im really impressed by your blog.
    Hello there, You’ve performed a fantastic job.

    I will definitely digg it and in my view recommend to my friends.

    I’m sure they’ll be benefited from this web site.

  30. I know this if off topic but I’m looking into starting my own blog and was
    wondering what all is required to get setup? I’m assuming
    having a blog like yours would cost a pretty penny?
    I’m not very web smart so I’m not 100% positive. Any recommendations or
    advice would be greatly appreciated. Thanks

  31. I blog often and I genuinely appreciate your information. This great article has truly peaked my interest.
    I will bookmark your website and keep checking for new details about once per
    week. I subscribed to your RSS feed too.

  32. It’s perfect time to make some plans for the future and it’s time to be happy.
    I’ve read this post and if I may just I wish to counsel you few fascinating issues or tips.
    Perhaps you can write subsequent articles relating to this article.
    I want to learn more issues about it!

  33. Ahaa, its good conversation concerning this article here at this
    blog, I have read all that, so at this time me also commenting at
    this place.

  34. A person necessarily lend a hand to make severely posts I’d state.

    That is the first time I frequented your website page and up to now?
    I amazed with the analysis you made to create this actual put
    up incredible. Magnificent activity!

  35. Article writing is also a fun, if you be familiar with after that you can write otherwise it is difficult to write.

  36. ลูกค้าบางส่วนที่เลือกใช้บริการกับเรา

    You’re utilizing a browser that won’t supported by Fb,
    so we’ve redirected you to a simpler Variation to supply you with the ideal encounter.

    รับกลยุทธ์การตลาดดิจิทัลที่ผ่านการพิสูจน์แล้ว
    จากทีมผู้เชี่ยวชาญของเราสู่การเพิ่มรายได้จากฝั่งออนไลน์ของคุณ

    แอดมินดูแลเพจ เว็บไซต์ และร้านค้าออนไลน์

    เยส เว็บ ดีไซน์ สตูดิโอ เป็นบริษัทที่รับออกแบบเว็บไซต์ ที่เชี่ยวชาญในการออกแบบเว็บไซต์และพัฒนาเว็บไซต์ให้กับลูกค้าที่ขอนแก่น เราคือบริษัททำเว็บไซต์หนึ่งเดียวในขอนแก่น ที่มีการออกแบบที่โดดเด่นไม่เหมือนใคร

    ด้วยประสบการณ์อย่างยาวนานในด้านการสร้างเว็บไซต์และพัฒนาเว็บไซต์ของเราเว็บไซต์ที่ตอบโจทย์และมีประสิทธิภาพในการใช้งาน

    วิธีการใช้งานสมัครเป็นฟรีแลนซ์เริ่มขายงานอย่างไรการชำระค่าจ้างรับประกันการจ้างงานบล็อกความรู้คำถามที่เจอบ่อย

    คุมงบได้เองมีผู้ช่วยดูแลจนจบงานตอบเร็วแน่นอนการันตีคุณภาพงาน

    เราดูแลลูกค้าด้วยการให้คำปรึกษาอย่างละเอียด และเมื่อเราเข้าใจเป้าหมายและข้อกำหนดของแบรนด์นั้นๆ
    แล้ว เราจะสามารถสร้างแคมเปญที่มีประสิทธิภาพ
    ซึ่งจะช่วยให้บริษัทของคุณเติบโตไปในทิศทางที่ดีที่สุด ไม่ว่าจะเป็นยอดการเข้าชมที่มากขึ้น คอนเวอร์ชั่นเรทที่สูงขึ้น การจัดอันดับที่ดีขึ้น หรือรายได้ที่มีนัยสำคัญยิ่งขึ้น ซึ่งเราจะทำการออกแบบกลยุทธ์เพื่อให้เหมาะกับกลุ่มลูกค้าและเป้าหมายของคุณมากที่สุด

    It seems like you were misusing this aspect by likely too speedy.
    You’ve been quickly blocked from working with it.

    เยส เว็บ ดีไซน์ สตูดิโอ บริษัทรับออกแบบเว็บไซต์ขอนแก่น รับทำเว็บขอนแก่น

    สิ่งที่จะได้รับเมื่อใช้บริการกับเรา

    บริการออกแบบเว็บไซต์ด้วยดีไซน์ชั้นนำของจังหวัดขอนแก่น

    ในฐานะการเป็นผู้นำทางด้านออกแบบ เราตั้งใจและหาวิธีทำให้ธุรกิจของคุณเป็นที่รู้จักกับลูกค้าและตรงต่อความต้องการ ต่อยอดธุรกิจ ขยายช่องทางการขาย และสร้างการรับรู้บนโลกออนไลน์

    It appears like you ended up misusing this feature by heading much too rapid.
    You’ve been temporarily blocked from employing it.

    พวกเราจะสร้างธุรกิจของคุณที่ขอนแก่น ด้วยเว็บไซต์ที่มีคุณภาพสูงและอัตราการเข้าถึงที่มีประสิทธิภาพ

    เราใส่ใจคุณตั้งแต่ขั้นตอนแรกจนถึงขั้นตอนสุดท้าย เพื่อตอบสนองความต้องการของลูกค้าอย่างมากที่สุด

  37. Today, I went to the beach front with my kids.

    I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She placed the shell to her ear
    and screamed. There was a hermit crab inside and it pinched her
    ear. She never wants to go back! LoL I know this is completely off topic but I had to tell someone!

  38. Dzięki za wskazówki dotyczące naprawy kredytu na temat tego wszystkiego blogu. Co ja chciałbym rada ludziom jest zrezygnować z tej mentalności że mogą teraz i zapłać później. As a as be a} społeczeństwo {my|my wszyscy|my wszyscy|wielu z nas|większość z nas|większość ludzi} ma tendencję do {robienia tego|robienia tamtego|próbowania tego|zdarzyć się|powtórz to} dla wielu {rzeczy|problemów|czynników}. Obejmuje to {wakacje|wakacje|wypady|wyjazdy wakacyjne|wycieczki|rodzinne wakacje}, meble, {i|jak również|a także|wraz z|oprócz|plus} przedmiotów {chcemy|chcielibyśmy|życzymy|chcielibyśmy|naprawdę chcielibyśmy to mieć}. Jednak {musisz|musisz|powinieneś|powinieneś chcieć|wskazane jest, aby|musisz} oddzielić {swoje|swoje|to|twoje obecne|swoje|osoby} chcą {od wszystkich|z potrzeb|z}. {Kiedy jesteś|Kiedy jesteś|Kiedy jesteś|Jeśli jesteś|Tak długo, jak jesteś|Kiedy} pracujesz, aby {poprawić swój kredyt|poprawić swoją zdolność kredytową|zwiększyć swój kredyt|zwiększyć swój kredyt|podnieś swój ranking kredytowy|popraw swój kredyt} wynik {musisz zrobić|zrobić|faktycznie potrzebujesz|naprawdę musisz} dokonać kilku {poświęceń|kompromisów}. Na przykład {możesz|możesz|możesz|możesz|będziesz mógł|| możesz|prawdopodobnie możesz} robić zakupy online {aby zaoszczędzić pieniądze|aby zaoszczędzić pieniądze|aby zaoszczędzić} lub {możesz przejść do|może się zwrócić|może odwiedzić|może obejrzeć|może sprawdzić|może kliknąć} używane {sklepy|sklepy|detaliści|sprzedawcy|punkty sprzedaży|dostawcy} zamiast {drogie|drogie|drogie|drogie|drogie|drogich} domów towarowych {dla|w odniesieniu do|dotyczących|odnoszących się do|przeznaczonych dla|do zdobycia} odzieży {strzykawki insulinowe 1ml|strzykawki tuberkulinowe|strzykawki|strzykawka|strzykawki insulinowe|strzykawki do insuliny|strzykawki trzyczęściowe tuberkulinowe|strzykawka tuberkulinowa|strzykawka insulinowa|strzykawka do insuliny|strzykawka trzyczęściowe tuberkulinowa}.

发表评论

邮箱地址不会被公开。