JNI编程之如何传递参数和返回值.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JNI编程之如何传递参数和返回值

首先要强调的是,native方法不但可以传递Java的基本类型做参数,还可以传递更复杂的类型,比如String,数组,甚至自定义的类。这一切都可以在jni.h中找到答案。 1. Java基本类型的传递 用过Java的人都知道,Java中的基本类型包括boolean,byte,char,short,int,long,float,double 这样几种,如果你用这几种类型做native方法的参数,当你通过javah -jni生成.h文件的时候,只要看一下生成的.h文件,就会一清二楚,这些类型分别对应的类型是 jboolean,jbyte,jchar,jshort,jint,jlong,jfloat,jdouble 。这几种类型几乎都可以当成对应的C++类型来用,所以没什么好说的。 2. String参数的传递 Java的String和C++的string是不能对等起来的,所以处理起来比较麻烦。先看一个例子, class Prompt { ??? // native method that prints a prompt and reads a line ??? private native String getLine(String prompt); ??? public static void main(String args[]) { ??????? Prompt p = new Prompt(); ??????? String input = p.getLine(Type a line: ); ?? ?????System.out.println(User typed: + input); ??? } ??? static { ??????? System.loadLibrary(Prompt); ??? } } 在这个例子中,我们要实现一个native方法 String getLine(String prompt); 读入一个String参数,返回一个String值。 通过执行javah -jni得到的头文件是这样的 #include jni.h #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有很多种方式,这里只讲一种我认为最简单的方式,看下面这个例子, #include Prompt.h #include iostream 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; /* OutOfMemoryError already thrown */ ??? } ??? 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类型的函数,还有其他的函数这里就不一一列举了。 3. 数组类型的传递 和String一样,

文档评论(0)

xjj2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档