JNI技术初步(四)

//返回一个结构数组,返回一个硬盘信息的结构数组 JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray (JNIEnv *env, jobject _obj) { //申明一个object数组 jobjectArray args = 0;

//数组大小 jsize len = 5;

//获取object所属类,一般为ava/lang/Object就可以了 jclass objClass = (env)->FindClass(“java/lang/Object”);

//新建object数组 args = (env)->NewObjectArray(len, objClass, 0);

/// 下面为获取到Java中对应的实例类中的变量/

//获取Java中的实例类 jclass objectClass = (env)->FindClass(“com/sundy/jnidemo/DiskInfo”);

//获取类中每一个变量的定义 //名字 jfieldID str = (env)->GetFieldID(objectClass,“name”,“Ljava/lang/String;”); //序列号 jfieldID ival = (env)->GetFieldID(objectClass,“serial”,“I”);

//给每一个实例的变量付值,并且将实例作为一个object,添加到objcet数组中 for(int i=0; i < len; i++ ) { //给每一个实例的变量付值 jstring jstr = WindowsTojstring(env,“我的磁盘名字是 D:”); //(env)->SetObjectField(obj,str,(env)->NewStringUTF(“my name is D:”)); (env)->SetObjectField(obj,str,jstr); (env)->SetShortField(_obj,ival,10);

//添加到objcet数组中 (env)->SetObjectArrayElement(args, i, _obj); } //返回object数组 return args;

}

//将jstring类型转换成windows类型 char jstringToWindows( JNIEnv env, jstring jstr ) { int length = (env)->GetStringLength(jstr ); const jchar jcstr = (env)->GetStringChars(jstr, 0 ); char rtn = (char)malloc( length2+1 ); int size = 0; size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length2+1), NULL, NULL ); if( size <= 0 ) return NULL; (env)->ReleaseStringChars(jstr, jcstr ); rtn[size] = 0; return rtn; } //将windows类型转换成jstring类型 jstring WindowsTojstring( JNIEnv env, char str ) { jstring rtn = 0; int slen = strlen(str); unsigned short * buffer = 0; if( slen == 0 ) rtn = (env)->NewStringUTF(str ); else { int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 ); buffer = (unsigned short )malloc( length2 + 1 ); if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 ) rtn = (env)->NewString( (jchar)buffer, length ); } if( buffer ) free( buffer ); return rtn; }

Java 测试native代码 这没有什么多说的,看代码吧 //主测试程序 public static void main(String[] args) { ChangeMethodFromJni changeJni = new ChangeMethodFromJni();

//输入常用的数值类型(string int boolean) System.out .println(“——————输入常用的数值类型(string int boolean)———–”); changeJni.displayParms(“Hello World!”, 100, true);

//调用一个静态方法 System.out.println(“——————调用一个静态方法———–”); int ret = changeJni.add(12, 20); System.out.println(“The result is: ” + String.valueOf(ret));

//输入一个数组 System.out.println(“——————输入一个数组———–”); boolean[] blList = new boolean[] { true, false, true }; changeJni.setArray(blList);

//返回一个字符串数组 System.out.println(“——————返回一个字符串数组———–”); String[] strList = changeJni.getStringArray(); for (int i = 0; i < strList.length; i++) { System.out.print(strList[i]); } System.out.println();

System.out.println(“——————返回一个结构———–”);

//返回一个结构 DiskInfo disk = changeJni.getStruct(); System.out.println(“name:” + disk.name); System.out.println(“Serial:” + disk.serial);

//返回一个结构数组

System.out.println(“——————返回一个结构数组 ———–”); DiskInfo[] diskList = changeJni.getStructArray(); for (int i = 0; i < diskList.length; i++) { System.out.println(“name:” + diskList[i].name); System.out.println(“Serial:” + diskList[i].serial); }

} 注:本程序在VS2003,eclipse (jse5.0) winxp sp2编译通过