当前位置: 代码迷 >> Android >> 请问一下关于JNI返回结构体数组的有关问题
  详细解决方案

请问一下关于JNI返回结构体数组的有关问题

热度:50   发布时间:2016-05-01 21:53:04.0
请教一下关于JNI返回结构体数组的问题!
C代码如下

   
#include <stdio.h>  
#include <math.h>  
#include "jni.h"  
 



#include <stdio.h>  
#include "stdlib.h"  
#include "string.h"  
  
#pragma comment (lib,"BaseInfo.lib")  
#pragma comment (lib,"jvm.lib")  


#include "com_sundy_jnidemo_CMFJ.h"

#include "com_sundy_jnidemo_DiskInfo.h"
  
 struct {  
  char str[256];  
  int serial;  
} DiskInfo;

char* jstringToWindows( JNIEnv *env, jstring jstr );  
//将windows类型转换成jstring类型  
jstring WindowsTojstring( JNIEnv* env, char* str );  
  
//主函数  

  

JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_CMFJ_getStructArray  
(JNIEnv *env, jobject obj)  

  //申明一个object数组  
  jobjectArray args=0 ;  
   
  //数组大小  
  jsize len = 5;  
 
  //获取object所属类,一般为ava/lang/Object就可以了  
  jclass objClass = (*env)->FindClass(env,"java/lang/Object");  
  
  //新建object数组  
  args = (*env)->NewObjectArray(env,len, objClass,0);  
  
  /**//* 下面为获取到Java中对应的实例类中的变量*/  
  
  //获取Java中的实例类  
  jclass objectClass = (*env)-> FindClass(env,"com/sundy/jnidemo/DiskInfo");  
  
  //给每一个实例的变量付值,并且将实例作为一个object,添加到objcet数组中  
//获取类中每一个变量的定义  
  //名字  
 jmethodID init = (*env)->GetMethodID(env, objectClass , "<init>", "(Ljava/lang/String;I)V");

int i;
  for( i=0; i < len; i++ )  
  {  

 
   

  
  //给每一个实例的变量付值  
  jobject newObj = (*env)->NewObject(env, objectClass, init, (*env)->NewStringUTF(env, "my name is D:"), 10);
  //添加到objcet数组中  
  (*env)->SetObjectArrayElement(env,args, i, newObj);  
  }  
  //返回object数组  
  return args;  
  
}  



但是结果出不来,求指正!

------解决方案--------------------
单个结构体还是可以返回的,用java的类与C的结构体对应,如果你想返回结构体数组的话,只能用上面的人说的bytearray返回了,java层在逐次解析出来
如果是后者的话,会比较麻烦,建议LZ换一种思路考虑吧。。。。。
探讨

对,通过与JAVA层建立的类对应,可以做到返回引用:

没看明白,不知道是不是这个意思:LZ想把C中的结构体数组返回给java层用?
  相关解决方案