JNI中C/C++字符串操作以及Java的String轉(zhuǎn)C++的string

string轉(zhuǎn)int

int t_port = atoi(port.c_str());

int轉(zhuǎn)string

int n = 0;
std::stringstream ss;
std::string str;
ss<<n;
ss>>str;

int轉(zhuǎn)char *

char str[32];
sprintf(str, "%d", 16);

string轉(zhuǎn)char*

char addr[32]={0};
strncpy(addr,ip.c_str(),31);

char*轉(zhuǎn)string

char* s="good boy";
string str=s;
或者
char s[20]="good boy";
string str=s;

string轉(zhuǎn)const char*

1妒茬、const char *p = str.data();
2快集、const char *p = str.c_str();

string轉(zhuǎn)換成char[]

string str = "good boy";
char p[20];
for(int i=0;i<str.length();i++)
p[i] = str[i];
p[str.length()] = '\0';
或者
string str="good boy";
char p[20];
str.copy(p,5,0);
*(p+5)='\0';

判斷字符串是否為空

szWord[0]==0


把java的string轉(zhuǎn)化成c的字符串

第一種方法

這種方法適合java傳入過來的String只在該JNI函數(shù)中調(diào)用群扶,但是如果把name賦值給全局變量,在c的其他函數(shù)中調(diào)用筒溃。
在安卓4.x系統(tǒng)是可以這樣用的,但是在安卓5.0以上的系統(tǒng)會出現(xiàn)重大問題现斋,全局變量globleName在其他函數(shù)中是空的讨阻,并沒有值,程序一運行在JNI中就崩潰了,具體原因我也不是很明白杰妓,推薦使用第二種方法藻治。

string globleName;

JNIEXPORT jstring JNICALL
Java_com_jnistudy_MainActivity_getResultromJNI(JNIEnv *env, jobject obj, jstring j_name) {
    string c_name = env->GetStringUTFChars(j_name, NULL);
    globleName = c_name;
    env->ReleaseStringUTFChars(j_name, c_name.c_str());
    return env->NewStringUTF("Hello world");
}

第二種方法(建議使用)

直接copy代碼放到.cpp中,返回值可以直接寫string巷挥,c++支持char* 桩卵、const char *、char[]直接賦值給string句各。

//把java的string轉(zhuǎn)化成c的字符串
char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
{
     char*   rtn   =   NULL;
     jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");  //String
     jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312"); //"gb2312"
     jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B"); //getBytes(Str);
     jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
     jsize   alen   =   (*env)->GetArrayLength(env,barr);
     jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
     if(alen   >   0)
     {
      rtn   =   (char*)malloc(alen+1);         //"\0"
      memcpy(rtn,ba,alen);
      rtn[alen]=0;
     }
     (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //釋放內(nèi)存空間
     return rtn;
}

C字符串轉(zhuǎn)java字符串

jstring strToJstring(JNIEnv* env, const char* pStr)
{
    int        strLen    = strlen(pStr);
    jclass     jstrObj   = (*env)->FindClass(env, "java/lang/String");
    jmethodID  methodId  = (*env)->GetMethodID(env, jstrObj, "<init>", "([BLjava/lang/String;)V");
    jbyteArray byteArray = (*env)->NewByteArray(env, strLen);
    jstring    encode    = (*env)->NewStringUTF(env, "utf-8");
    (*env)->SetByteArrayRegion(env, byteArray, 0, strLen, (jbyte*)pStr);
    
    return (jstring)(*env)->NewObject(env, jstrObj, methodId, byteArray, encode);
} 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吸占,一起剝皮案震驚了整個濱河市晴叨,隨后出現(xiàn)的幾起案子凿宾,更是在濱河造成了極大的恐慌,老刑警劉巖兼蕊,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初厚,死亡現(xiàn)場離奇詭異,居然都是意外死亡孙技,警方通過查閱死者的電腦和手機产禾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牵啦,“玉大人亚情,你說我怎么就攤上這事」” “怎么了楞件?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裳瘪。 經(jīng)常有香客問我土浸,道長,這世上最難降的妖魔是什么彭羹? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任黄伊,我火速辦了婚禮,結(jié)果婚禮上派殷,老公的妹妹穿的比我還像新娘还最。我一直安慰自己,他們只是感情好毡惜,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布拓轻。 她就那樣靜靜地躺著,像睡著了一般虱黄。 火紅的嫁衣襯著肌膚如雪悦即。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音辜梳,去河邊找鬼粱甫。 笑死,一個胖子當著我的面吹牛作瞄,可吹牛的內(nèi)容都是我干的茶宵。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼宗挥,長吁一口氣:“原來是場噩夢啊……” “哼乌庶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起契耿,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤瞒大,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搪桂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體透敌,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年踢械,在試婚紗的時候發(fā)現(xiàn)自己被綠了酗电。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡内列,死狀恐怖撵术,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情话瞧,我是刑警寧澤嫩与,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站移稳,受9級特大地震影響蕴纳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜个粱,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一古毛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧都许,春花似錦稻薇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睛低,卻和暖如春案狠,著一層夾襖步出監(jiān)牢的瞬間服傍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工骂铁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吹零,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓拉庵,卻偏偏與公主長得像灿椅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钞支,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容