日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android的JNI开发涉及的char和string之间的互相转换

發(fā)布時間:2024/9/5 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android的JNI开发涉及的char和string之间的互相转换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考了文章:http://blog.csdn.net/ztp800201/article/details/7388189,http://blog.csdn.net/liaowenfeng/article/details/8668085

總結(jié)如下:

在jni中使用env是有兩種情況的,c語言和c++語言。

C語言互相轉(zhuǎn)換版本:

//將char類型轉(zhuǎn)換成jstring類型 jstring CStr2Jstring( JNIEnv* env,const char* str ) {jsize len = strlen(str);// 定義java String類 strClassjclass strClass = (*env)->FindClass(env, "java/lang/String");//設(shè)置String, 保存語言類型,用于byte數(shù)組轉(zhuǎn)換至String時的參數(shù)jstring encoding = (*env)->NewStringUTF(env, "GB2312");// 獲取java String類方法String(byte[],String)的構(gòu)造器,用于將本地byte[]數(shù)組轉(zhuǎn)換為一個新StringjmethodID ctorID = (*env)->GetMethodID(env, strClass, "<init>", "([BLjava/lang/String;)V");// 建立byte數(shù)組jbyteArray bytes = (*env)->NewByteArray(env, len);// 將char* 轉(zhuǎn)換為byte數(shù)組(*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)str);//將byte數(shù)組轉(zhuǎn)換為java String,并輸出return (jstring)(*env)->NewObject(env, strClass, ctorID, bytes, encoding); }//將jstring類型轉(zhuǎn)換成char類型 char * Jstring2CStr( JNIEnv * env, jstring jstr ) {char * rtn = NULL;jclass clsstring = (*env)->FindClass(env, "java/lang/String");jstring strencode = (*env)->NewStringUTF(env, "GB2312");jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env, jstr,mid,strencode);jsize alen = (*env)->GetArrayLength(env, barr);jbyte * ba = (*env)->GetByteArrayElements(env, barr,JNI_FALSE);if(alen > 0){rtn = (char*)malloc(alen+1); //new char[alen+1];memcpy(rtn,ba,alen);rtn[alen]=0;}(*env)->ReleaseByteArrayElements(env, barr,ba,0);return rtn; }

C++版本如下:

//將char類型轉(zhuǎn)換成jstring類型 jstring CStr2Jstring( JNIEnv* env, const char* pat ) { // 定義java String類 strClass jclass strClass = (env)->FindClass("Ljava/lang/String;"); // 獲取java String類方法String(byte[],String)的構(gòu)造器,用于將本地byte[]數(shù)組轉(zhuǎn)換為一個新String jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); // 建立byte數(shù)組 jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat)); // 將char* 轉(zhuǎn)換為byte數(shù)組 (env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat); //設(shè)置String, 保存語言類型,用于byte數(shù)組轉(zhuǎn)換至String時的參數(shù) jstring encoding = (env)->NewStringUTF("GB2312"); //將byte數(shù)組轉(zhuǎn)換為java String,并輸出 return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding); } char * Jstring2CStr( JNIEnv * env, jstring jstr ) { char * rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("GB2312"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode); jsize alen = env->GetArrayLength(barr); jbyte * ba = env->GetByteArrayElements(barr,JNI_FALSE); if(alen > 0) { rtn = (char*)malloc(alen+1); //new char[alen+1]; memcpy(rtn,ba,alen); rtn[alen]=0; } env->ReleaseByteArrayElements(barr,ba,0); return rtn; }

</pre><p></p><pre>注意上面兩種情況env的不同使用方法,具體的解釋可參考jni..h頭文件中的說明:

/** We use inlined functions for C++ so that programmers can write:** env->FindClass("java/lang/String")** in C++ rather than:** (*env)->FindClass(env, "java/lang/String")** in C.*/另外注意下面這句話的不同,主要指“”里的字符串,兩個版本不同,我用的是C語言,剛開始是用網(wǎng)上下面的一個版本,運(yùn)行總是崩掉,最后換成上面一個版本才OK。C++的版本有人如果遇到注意一下即可。

C語言版本:

jclass strClass = (*env)->FindClass(env, "java/lang/String");

C++版本:

jclass strClass = (env)->FindClass("Ljava/lang/String;");





總結(jié)

以上是生活随笔為你收集整理的Android的JNI开发涉及的char和string之间的互相转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。