Android JNI開發入門篇

來源:互聯網
上載者:User

1.
有關JNI的類型方法表示,很多網友不明白,下面Android開發網就,基本上C層面的類型均是j+java過去的類型,比如字串在JNI的c層面為
jstring而Java為String,對於布爾類型boolean則為jboolean對應Java中的boolean。

  2. 有關Java類的表示在JNI中對應關係如下

  long cwjInfo (int nAge, String sName, int[] arrSalary
);  

  我們可以表示為  "(ILjava/lang/String;[I)J"   
我們去除雙引號,第一個(表示一個參數類型,接下來的I表示第一個參數為int整形,L代表是一個類class,這裡為java/lang/String
這個類,接下來是[代表是一個數組,後面的I代表一個整形的數組,而)後面的J代表傳回型別,在JNI中J代表long長整形,相關的對應關係如下:

V void
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully qualified class
[  array type[]
( arg-types

 3.
Java層傳入的String不能在JNI中直接轉化為jstring,因為Java的內部編碼為unicode,中英文的字元都是每個佔兩個位元組,而
jni中我們需要使用utf-8來表示,utf-8比較特殊中英文是不等長的,比如英文等符號的ascii佔用一個位元組,而中文則為三個位元組,同時仍然
以/n結尾,所以下面這種錯誤的方法為

JNIEXPORT jstring JNICALL Java_Cwj_ShowLog(JNIEnv *env, jobject obj, jstring log)<br />{<br /> printf("%s", log); //這樣做是錯誤的,printf不能直接處理Java傳來的類型。<br /> //dosomething 返回jstring等等。<br />}

而正確的轉換unicode到utf-8方法為使用GetStringUTFChars這個函數:

JNIEXPORT jstring JNICALL Java_Cwj_ShowLog(JNIEnv *env, jobject obj, jstring log)<br />{<br /> const jbyte *strDest;<br /> strDest = (*env)->GetStringUTFChars(env, log, NULL);<br /> if (strDest == NULL)<br /> {<br /> return NULL; //這裡注意可能因為記憶體不足,需要拋出OutOfMemoryError異常,所以先返回空,有關JNI的異常處理Android開發網將在下面的文章中詳細講解<br /> }<br /> printf("%s", strDest); //現在strDest可以用printf顯示了<br /> (*env)->ReleaseStringUTFChars(env, prompt, strDest); //strDest用完了要釋放記憶體

接下來我們還需要返回一個jstring類型的,我們可以讓使用者自己輸入,比如

char szBuf[255]; //分配一個緩衝區<br /> scanf("%s", szBuf); //接收使用者輸入<br />return (*env)->NewStringUTF(env, szBuf); //返回一個utf-8的即jstring的字串

4. 在JNI中擷取字串的長度不能簡單的使用strlen這樣的函數,對於不同的處理我們可以通過
GetStringLength擷取一個Java的unicode類型(wchar_t* )的字串長度,或者GetStringUTFLength獲
取jni中的utf-8類型(char*)字串長度。

5. 最後今天Android123給網友一個分辨處理jni還是java類型的技巧,有關jni相關的字元或字串處理均帶有utf關鍵字,

   比如處理java的unicode類型的有:

  GetStringChars/ReleaseStringChars GetStringLength NewString GetStringRegion

  而對應jni的utf8類型的有:

  GetStringUTFChars/ReleaseStringUTFChars  GetStringUTFLength NewStringUTF GetStringUTFRegion

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.