Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android JNI開發入門篇

Android JNI開發入門篇

編輯:高級開發

昨天我們大概講了下android NDK的開發概況和常見的技巧,很多網友感到表示十分感興趣發來了郵件希望繼續,今天android123還是從頭還是談論下Java的調用C++的JNI,以便大家開發出一些功能較強大些的android應用,如果有疑問可以仍然來函至 [email protected]

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)
{
printf("%s", log); //這樣做是錯誤的,printf不能直接處理Java傳來的類型。

//DOSomething 返回JString等等。
}

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

JNIEXPORT JString JNICALL Java_Cwj_ShowLog(JNIEnv *env, jobject obj, JString log)
{

const jbyte *strDest;
strDest = (*env)->GetStringUTFChars(env, log, NULL);
if (strDest == NULL)
{
return NULL; //這裡注意可能因為內存不足,需要拋出OutOfMemoryError異常,所以先返回空,有關JNI的異常處理android開發網將在下面的文章中詳細講解
}

printf("%s", strDest); //現在strDest可以用printf顯示了

(*env)->ReleaseStringUTFChars(env, prompt, strDest); //strDest用完了要釋放內存

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

char szBuf[255]; //分配一個緩沖區
scanf("%s", szBuf); //接收用戶輸入
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

有關android的NDK JNI開發相關內容我們將在下周繼續講解。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved