1. 程式人生 > >JNI中jstring 和char* 之間的轉換方法

JNI中jstring 和char* 之間的轉換方法

在java中由於是unicode編碼,無論是英文字母還是漢字每個字元都是佔用2個位元組。但是在jni中的字元時utf-8編碼,每個字元不是等長的。所以在java和jni呼叫的時候要注意這個問題。

下面是我在網上找到的一些把jstring和char*轉換的一些sample程式碼:

jstring to char*  char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
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);

memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
} char* to jstring  jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}

相關推薦

JNIjstring char* 之間轉換方法

在java中由於是unicode編碼,無論是英文字母還是漢字每個字元都是佔用2個位元組。但是在jni中的字元時utf-8編碼,每個字元不是等長的。所以在java和jni呼叫的時候要注意這個問題。 下面是我在網上找到的一些把jstring和char*轉換的一些sampl

JNIStringchar之間的相互轉換

 最近在學習NDK下的opengl es2.0開發,看過很多demos都是直接用一串字串把shader程式碼寫死的。並沒有用一個單獨的shader指令碼語言檔案。glShaderSource()這個方法需要的shader指令碼也是通過一個char** 傳入的。 而且在

jnibyte[]char*相互轉換

id= (*env)->GetFieldID(env, objectClass, filedName, "[B"); jbyteArray dataArray=(jbyteArray)((*env)-> GetObjectField(env,object,id));

對於QtQStringchar*之間的互相轉換問題(系列二)

對於Qt,雖說對C++全部相容,但是一旦涉及到和介面的資料的互動操作,難免涉及到char*和QString的轉換問題,轉換的過程很簡單,這裡總結了一下網上提供的最簡單的一個方法: 從char*轉成QString型別: 使用fromLocal8Bit方法進行轉換: char * te

Javabyte[]char[]互相轉換

main enc chart code pre void flip rgs === package gj; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.char

JNIjstring 與 const char* 相互轉換函式

在平時的工作,經常用到jni和const型別轉換。 //將const char型別轉換成jstring型別 jstring CStr2Jstring( JNIEnv* env, const char* pat ) { //定義java String類 strClass j

c++string、const char*char*之間的相互轉換

1. string轉const char* string s = “abc”; const char* c_s = s.c_str(); 2. const char* 轉string,直接賦值即可 const char* c_s = “abc”; string s(c_s

Android BitmapDrawable相互轉換方法

canvas board null height .com factory oar tool pla 1、Drawable --> Bitmap [java] view plain copy Bitmap drawable2Bitmap(Drawabl

C#List和數組之間轉換方法

post zone 和數 技術 ati brush -h 實現 play 本文實例講述了C#中List和數組之間轉換的方法。分享給大家供大家參考。具體分析如下: 一、List轉數組 (從List<string>轉到string[])List<string

PHPXML陣列互相轉換方法

轉換程式碼如下 //陣列轉XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) {

30-python3 bytes string 之間的互相轉換

轉自:http://www.jb51.net/article/105064.htm   password = b'123456' 等價於: pw = '123456' password = pw.encode(encoding='utf-8')      前言

Spark RDDDataSet之間轉換

什麼是RDD:Spark提供了一個抽象的彈性分散式資料集,是一個由叢集中各個節點以分割槽的方式排列的集合,用以支援平行計算。RDD在驅動程式呼叫hadoop的檔案系統的時候就建立(其實就是讀取檔案的時候就建立),或者通過驅動程式中scala集合轉化而來,使用者也可以用spar

VC charTCHAR之間轉換

                char:計算機程式語言(c、c++、java、VFP等)中可容納單個字元的一種基本資料型別。TCHAR:為了滿足Unicode編碼,對char的擴充套件,即_T(“str”)表示TCHAR型別C++支援兩種字串,即常規的ANSI編碼(使用""包裹)和Unicode編碼(使用L

【C++】const char* char* 之間轉換

const char*是指向常量的指標,而不是指標本身為常量,可以不被初始化.該指標可以指向常量也可以指向變數,只是從該指標的角度而言,它所指向的是常量, 通過該指標不能修改它所指向的資料.  1.const char*是不能直接賦值到char*的,這樣編譯都不能通過,理由

Unicode下CStringchar *之間的互相轉換

 CString中儲存的字元的資料型別為wchar_t型別。 一、CString轉換為char * (1)方法一:使用wcstombs() [cpp] view plain copy print? #include <iostream>usingnamespace std;  #in

Android JNICJAVA程式碼之間的互相呼叫

jobject (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...); jobject (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list); jobject

Oracledatetimestamp之間轉換

前幾天,gf的專案中用到了timestamp型別欄位,轉換了幾次,都報錯,今天有時間,就把date與timestamp型別的轉換做以測試,總結如下: 一、首先說下date和timestamp的不同吧。 大家知道,date型別能夠儲存月,年,日,世紀,時,分和秒,而經常的格式

mysql字串時間互相轉換方法(自動轉換及DATE_FORMAT函式)

mysql中字串和時間互相轉換的方法(自動轉換及DATE_FORMAT函式) 一、mysql中字串轉換成日期 下面將講述如何在MYSQL中把一個字串轉換成日期: 1、無需轉換的:  SELECT * FROM tairlist_day WHERE rq>'2010-07-31' AND rq<

Androiddppx之間進行轉換

在xml佈局檔案中,我們既可以設定px,也可以設定dp(或者dip)。一般情況下,我們都會選擇使用dp,這樣可以保證不同螢幕解析度的機器上佈局一致。但是在程式碼中,如何處理呢?很多控制元件的方法中都只提供了設定px的方法,例如setPadding,並沒有提供設定dp的方法。

JAVAint,string,char之間的互相轉換

(1)字串string轉int: int i=Integer.parseInt(str);//使用Integer.parseInt(String str)函式,返回str所代表的int值; (2)如何