这种情况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类中基本类型成员做操作。