这种情况javaclass对应C++/C的结构体,即就是javaclass中的成员变量和C++/C中结构体的成员变量一一对应。假设C++/C的结构体定义为:


typedef struct _Para_tag


{


   int x;


   short y;


   char az[100];


     char h;


unsigned int t;


}Para_Tag;


那么对应的Java中的class为:


public class Para_Tag


{


   int x;


   short y;


   String z;


   char h;


   long t; // 注意,Java中没有unsigned int 类型,为了保持精度,用long


}


Java 接口:public  void setPara(Para_Tag tag);


            JNI:


JNIEXPORT void  JNICALL Java_setPara_ 1native (JNIEnv *env, jclass thiz, jobject obj)


{


            Para_Tag  tag;


            jclass DataCls = env->FindClass("com/Para_Tag"); // 通过class path找到class的标识


              /*  struct中的每个变量逐一赋值 */


            jfieldID dataId = env->GetFieldID(DataCls, "x", "I");


             tag.x = env->GetIntField(obj, dataId);


            dataId = env->GetFieldID(DataCls, "y", "S");


            tag.y = env->GetShortField(obj, dataId);


           dataId = env->GetFieldID(DataCls, "z", "Ljava/lang/String;");


              /*  注意Java中的String类型如何通过JNI转换为char *  */


              jstring jstr = (jstring)env->GetObjectField(obj, dataId);


              const char* str;


             jboolean isCopye = false;


            if(NULL == jstr)


            {


                  return;      


           }


          str = env->GetStringUTFChars(jstr, &isCopye);


          strncpy(tag.az,str,100);


          tag.az[99] = '\0';


           env->ReleaseStringUTFChars(jstr, str); // 注释放转为UTF-8String对象空间


          dataId = env->GetFieldID(DataCls, "h", "C");


         tag.h = env->GetCharField(obj, dataId);



         dataId = env->GetFieldID(DataCls, "t", "J"); // 注意long对应的签名是J,不是L


          tag.t = (jlong)env->GetLongField(obj, dataId);


}


从上面例子看出主要是调用env->FindClass,找到对应Java类,后面就是针对Java类中基本类型成员做操作。