首先定义了一个类class device{String strDeviceName;int i;}然后定义一个本地函数 public native int ListDev(device[] devList)然后在本地用c实现:JNIEXPORT jint JNICALL Java_com_NDKTSPtest_JniTspTest_Listdev(JNIEnv *e, jobject j, jobjectArray devList){jint dwRet;jobject dev1 = (*e)->GetObjectArrayElement(e, devList, 0);;
  jclass dev = (*e)->FindClass(e, "com/hengbao/tspdatastructure/DEVICE");
  jfieldID strDeviceName = (*e)->GetFieldID(e, dev, "strDeviceName", "Ljava/lang/String;");
  jfieldID iType = (*e)->GetFieldID(e, dev, "iType", "I");
  jstring jstr = (*e)->NewStringUTF(e,DeviceName);
  (*e)->SetObjectField(e, dev1, strDeviceName, jstr);
  (*e)->SetIntField(e, dev1, iType, UK_SDKEYID);
  dwRet =RT_OK;
  (*e)->ReleaseStringUTFChars(e, jstr, DeviceName);return dwRet;}总是有问题 这个取得类数组里面的引用类型对吗?总感觉有点问题 但又不知道问题处在哪儿?
但是在android在开发会出现问题 logcat如下:06-14 08:58:15.805: DEBUG/dalvikvm(719): Added shared lib /data/data/com.NDKTSPtest/lib/libmyjni.so 0x43597d18
06-14 08:58:15.828: DEBUG/dalvikvm(719): No JNI_OnLoad found in /data/data/com.NDKTSPtest/lib/libmyjni.so 0x43597d18
06-14 08:58:15.854: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libwebcore.so' for 'InitParams' (wrong CL)
06-14 08:58:15.864: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libmedia_jni.so' for 'InitParams' (wrong CL)
06-14 08:58:15.874: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libwebcore.so' for 'ListUK' (wrong CL)
06-14 08:58:15.885: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libmedia_jni.so' for 'ListUK' (wrong CL)
06-14 08:58:15.885: WARN/dalvikvm(719): JNI WARNING: illegal start byte 0xf0
06-14 08:58:15.885: WARN/dalvikvm(719):              string: 'ð5ZC '
06-14 08:58:15.893: WARN/dalvikvm(719):              in Lcom/NDKTSPtest/JniTspTest;.ListUK ([Lcom/hengbao/tspdatastructure/DEVICE;)I (FindClass)
06-14 08:58:15.893: INFO/dalvikvm(719): "main" prio=5 tid=3 NATIVE
06-14 08:58:15.893: INFO/dalvikvm(719):   | group="main" sCount=0 dsCount=0 s=0 obj=0x40018e70
06-14 08:58:15.893: INFO/dalvikvm(719):   | sysTid=719 nice=0 sched=0/0 handle=-1097671524
06-14 08:58:15.893: INFO/dalvikvm(719):   at com.NDKTSPtest.JniTspTest.ListUK(Native Method)

解决方案 »

  1.   

    楼主意思太模糊了吧。
    jclass dev = (*e)->FindClass(e, "com/hengbao/tspdatastructure/DEVICE");
    而且好乱。
    放一段代码//返回一个结构数组,返回一个硬盘信息的结构数组
    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; }
      

  2.   

    没研究你的C代码实现,但是至少你要保证在C里面实现的函数名要与你在JAVA里调用的函数名一致吧。
    注意大小写阿!!