這種情況java的class對應C++/C的結構體,即就是java的class中的成員變量和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-8的String對象空間
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類中基本類型成員做操作。