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

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