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;  
  
}  但是结果出不来,求指正!

解决方案 »

  1.   

    调试没问题,就是JAVA调用没有结果,模拟器直接弹出
      

  2.   

    也就是我调用直接显示在eclipse上不能
      

  3.   

    JAVA代码
    package com.sundy.jnidemo;import android.app.Activity;
    import android.os.Bundle;
    import java.lang.*;
    public class CMFJ extends Activity {
        /** Called when the activity is first created. */
    static {
        System.loadLibrary("CMFJ");
    }  public native DiskInfo[] getStructArray();   @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
          
            System.out.println("------------------返回一个结构数组 -----------");  
            CMFJ changeJni = new CMFJ();
            DiskInfo[] diskList = changeJni.getStructArray(); 
            int i;
                    for (i = 0; i < diskList.length; i++) {  
                      System.out.println("name:" + diskList[i].name);  
                      System.out.println("Serial:" + diskList[i].serial); 
    }
    }
    }
      

  4.   

    就是说jclass objectClass、jmethodID init、jobject newObj都正常的生成或者获取到了,但是返回到java的程序里就不对了?
      

  5.   

    也不算,就是程序没有报错,但返回到JAVA不到
      

  6.   

    不知道唉,我用的没问题的。。貌似咱俩JNI的版本不一样。。我要写成env->SetObjectArrayElement,而不是(env*)->。而且只有3个参数
      

  7.   

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

  8.   


    尝试下通过byte数组方式返回,C++里面的结构内容转成byte数组,java代码里面再解析出来。
      

  9.   

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

  10.   

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