知識(五)Java調用C++/C函數之Java參數類型是Class

這種情況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類中基本類型成員做操作。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章