android 之JNI 詳解(八)

在這個例子中,我們要實現一個native方法 String getLine(String prompt);

  讀入一個String參數,返回一個String值。
  通過執行javah -jni得到的頭文件是這樣的

Java代碼:

  1. #include

  2. #ifndef _Included_Prompt
  3. #define _Included_Prompt
  4. #ifdef __cplusplus

  5. extern "C" {
  6. #endif

  7. JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject this, jstring prompt);

  8. #ifdef __cplusplus
  9. }

  10. #endif
  11. #endif
複製代碼


       jstring是JNI中對應於String的類型,但是和基本類型不同的是,jstring不能直接當作C++的string用。如果你用cout << prompt << endl;

  編譯器肯定會扔給你一個錯誤信息的。

  其實要處理jstring有很多種方式,這裏只講一種我認爲最簡單的方式,看下面這個例子,

Java代碼:

  1. #include "Prompt.h"
  2. #include

  3. JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt){

  4. const char* str;
  5. str = env->GetStringUTFChars(prompt, false);

  6. if(str == NULL) {
  7. return NULL;
  8. }

  9. std::cout << str << std::endl;
  10. env->ReleaseStringUTFChars(prompt, str);
  11. char* tmpstr = "return string succeeded";
  12. jstring rtstr = env->NewStringUTF(tmpstr);
  13. return rtstr;
  14. }

複製代碼


       在上面的例子中,作爲參數的prompt不能直接被C++程序使用,先做了如下轉換
  str = env->GetStringUTFChars(prompt, false);
  將jstring類型變成一個char*類型。
  返回的時候,要生成一個jstring類型的對象,也必須通過如下命令,
  jstring rtstr = env->NewStringUTF(tmpstr);
  這裏用到的GetStringUTFChars和NewStringUTF都是JNI提供的處理String類型的函數,還有其他的函數這裏就不一一列舉了。

 

系列之Android 深入研究JNI(八)的帖子鏈接http://www.eoeandroid.com/thread-90135-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章