JNI 返回结构体参数(2)

2019-04-22 20:49

objects对象 Lfully-qualified-class-name;L类名 Arrays数组 [array-type [数组类型

methods方法 (argument-types)return-type(参数类型)返回类型

※确定域和方法的符号

下面我们来看看,如果通过使用数组和对象,从C++中的获取到Java中的DiskInfo 类对象,并返回一个DiskInfo数组:

Java代码 1. //返回一个结构数组,返回一个硬盘信息的结构数组 2. JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray 3. (JNIEnv *env, jobject _obj) 4. { 5. //申明一个object数组 6. jobjectArray args = 0; 7. 8. //数组大小 9. jsize len = 5; 10. 11. //获取object所属类,一般为ava/lang/Object就可以了 12. jclass objClass = (env)->FindClass(\); 13. 14. //新建object数组 15. args = (env)->NewObjectArray(len, objClass, 0); 16. 17. /**//* 下面为获取到Java中对应的实例类中的变量*/ 18. 19. //获取Java中的实例类 20. jclass objectClass = (env)->FindClass(\); 21. 22. //获取类中每一个变量的定义 23. //名字 24. jfieldID str = (env)->GetFieldID(objectClass,\,\); 25. //序列号 26. jfieldID ival = (env)->GetFieldID(objectClass,\,\); 27. 28. //给每一个实例的变量付值,并且将实例作为一个object,添加到objcet数组中 29. for(int i=0; i < len; i++ ) 30. { 31. //给每一个实例的变量付值 32. jstring jstr = WindowsTojstring(env,\我的磁盘名字是 D:\); 33. //(env)->SetObjectField(_obj,str,(env)->NewStringUTF(\ 34. (env)->SetObjectField(_obj,str,jstr); 35. (env)->SetShortField(_obj,ival,10); 36. 37. //添加到objcet数组中 38. (env)->SetObjectArrayElement(args, i, _obj); 39. } 40. //返回object数组 41. return args; 42. 43. } 44. 45. 46. 全部的C/C++方法实现代码如下: 47. /**//* 48. * 49. * 一缕阳光(sundy)版权所有,保留所有权利。 50. */ 51. /**//** 52. * 53. * TODO Jni 中一个从Java到C/C++参数传递测试类 54. * 55. * @author 刘正伟(sundy) 56. * @see http://www.cnweblog.com/sundy 57. * @see mailto:sundy26@126.com 58. * @version 1.0 59. * @since 2005-4-30 60. * 61. * 修改记录: 62. * 63. * 日期 修改人 描述 64. * ---------------------------------------------------------------------------------------------- 65. * 66. * 67. * 68. */ 69. // JniManage.cpp : 定义 DLL 应用程序的入口点。 70. // 71. package com.sundy.jnidemo; 72. #include \ 73. 74. #include 75. #include 76. #include \ 77. #include \ 78. 79. #include \ 80. #include \ 81. #include \ //通过javah –jni javactransfer 生成 82. #include 83. #include \ 84. #include \ 85. 86. #pragma comment (lib,\) 87. #pragma comment (lib,\) 88. //硬盘信息 89. struct { 90. char name[256]; 91. int serial; 92. }DiskInfo; 93. /**//*BOOL APIENTRY DllMain( HANDLE hModule, 94. DWORD ul_reason_for_call, 95. LPVOID lpReserved 96. ) 97. { 98. LPTSTR strName = new CHAR[256] ; 99. (*GetHostName)(strName); 100. printf(\ 101. delete [] strName; 102. 103. return TRUE; 104. }*/ 105. //将jstring类型转换成windows类型 106. char* jstringToWindows( JNIEnv *env, jstring jstr ); 107. //将windows类型转换成jstring类型 108. jstring WindowsTojstring( JNIEnv* env, char* str ); 109. 110. //主函数 111. BOOL WINAPI DllMain(HANDLE hHandle, DWORD dwReason, LPVOID lpReserved) 112. { 113. return TRUE; 114. } 115. //输入常用的数值类型 Boolean,Byte,Char,Short,Int,Float,Double 116. JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_displayParms 117. (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b) 118. { 119. const char* szStr = (env)->GetStringUTFChars(s, 0 ); 120. printf( \, szStr ); 121. printf( \, i ); 122. printf( \, (b==JNI_TRUE ? \ : \) ); 123. (env)->ReleaseStringUTFChars(s, szStr ); 124. } 125. 126. //调用一个静态方法,只有一个简单类型输出 127. JNIEXPORT jint JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_add 128. (JNIEnv *env, jobject, jint a, jint b) 129. { 130. int rtn = (int)(a + b); 131. return (jint)rtn; 132. } 133. 134. /**/////输入一个数组,这里输入的是一个Boolean类型的数组 135. JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_setArray 136. (JNIEnv *env, jobject, jbooleanArray ba) 137. { 138. jboolean* pba = (env)->GetBooleanArrayElements(ba, 0 ); 139. jsize len = (env)->GetArrayLength(ba); 140. int i=0; 141. // change even array elements 142. for( i=0; i < len; i+=2 ) 143. { 144. pba[i] = JNI_FALSE; 145. printf( \, (pba[i]==JNI_TRUE ? \ : \) ); 146. } 147. (env)->ReleaseBooleanArrayElements(ba, pba, 0 ); 148. } 149. 150. /**/////返回一个字符串数组 151. JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStringArray 152. (JNIEnv *env, jobject) 153. { 154. jstring str; 155. jobjectArray args = 0; 156. jsize len = 5; 157. char* sa[] = { \, \, \, \, \ }; 158. int i=0; 159. args = (env)->NewObjectArray(len,(env)->FindClass(\),0); 160. for( i=0; i < len; i++ ) 161. { 162. str = (env)->NewStringUTF(sa[i] ); 163. (env)->SetObjectArrayElement(args, i, str); 164. } 165. return args; 166. } 167. 168. //返回一个结构,这里返回一个硬盘信息的简单结构类型 169. JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct 170. (JNIEnv *env, jobject obj) 171. { 172. /**//* 下面为获取到Java中对应的实例类中的变量*/ 173. 174. //获取Java中的实例类 175. jclass objectClass = (env)->FindClass(\); 176. 177. //获取类中每一个变量的定义 178. //名字 179. jfieldID str = (env)->GetFieldID(objectClass,\,\); 180. //序列号 181. jfieldID ival = (env)->GetFieldID(objectClass,\,\); 182. 183. 184. //给每一个实例的变量付值 185. (env)->SetObjectField(obj,str,(env)->NewStringUTF(\)); 186. (env)->SetShortField(obj,ival,10); 187. 188. return obj; 189. } 190. 191. //返回一个结构数组,返回一个硬盘信息的结构数组 192. JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray 193. (JNIEnv *env, jobject _obj) 194. { 195. //申明一个object数组 196. jobjectArray args = 0; 197. 198. //数组大小 199. jsize len = 5; 200. 201. //获取object所属类,一般为ava/lang/Object就可以了 202. jclass objClass = (env)->FindClass(\); 203.


JNI 返回结构体参数(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:杭州市团务知识学习网 网上自测题及答案(5套,每套100题)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: