在這個例子中,我們要實現一個native方法 String getLine(String prompt);
讀入一個String參數,返回一個String值。
通過執行javah -jni得到的頭文件是這樣的
Java代碼:
- #include
- #ifndef _Included_Prompt
- #define _Included_Prompt
- #ifdef __cplusplus
- extern "C" {
- #endif
- JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject this, jstring prompt);
- #ifdef __cplusplus
- }
- #endif
- #endif
jstring是JNI中對應於String的類型,但是和基本類型不同的是,jstring不能直接當作C++的string用。如果你用cout << prompt << endl;
編譯器肯定會扔給你一個錯誤信息的。
其實要處理jstring有很多種方式,這裏只講一種我認爲最簡單的方式,看下面這個例子,
Java代碼:
- #include "Prompt.h"
- #include
- JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt){
- const char* str;
- str = env->GetStringUTFChars(prompt, false);
- if(str == NULL) {
- return NULL;
- }
- std::cout << str << std::endl;
- env->ReleaseStringUTFChars(prompt, str);
- char* tmpstr = "return string succeeded";
- jstring rtstr = env->NewStringUTF(tmpstr);
- return rtstr;
- }
在上面的例子中,作爲參數的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